在按順序遞增的陣列中查詢缺少的某一個數字
題目是這樣的:
給出一個數組arr內容是0-99的數字,從中間隨機取出一個數字x,剩下的數字在陣列arr中遞增排序,求:使用最優的方法從陣列arr中找到隨機取出的x是多少
下面寫的是js語法形式
方法一:
這是最笨也是最普通的方法,時間複雜度為O(n),for迴圈整個陣列,前後兩兩想減,如果為1說明不是要找的,如果是2說明是中間缺少一個數字的,然後當前i下標的數字+1就是去除來的數字x
var arr = [0,1,2,3,4,5,6,8,9] var x= searchNum1( arr ); console.log(x); function searchNum1( arr ){ if( arr.length <=0 ) return false; for ( var i= 0,len=arr.length;i<len;i++ ){ if( arr[i+1] - arr[i] == 2 ){ return arr[i]+1; } } }
結果是: 7
方法二:
優化的寫法,利用首尾相加值相同的原理,減少for迴圈的迴圈次數,時間複雜度為O(n/2) , 當首尾相加的和不等於9時,說明這兩個數字的附近有一個就是要找的數字x,然後分別往前和往後計算差值是否為1就可以確認x是多少了,另外這個方法要處理下中間的數字,由於長度是奇數,所以中間的數字是個獨立的數字不會跟任何其他數字相加,所以單獨處理下
var arr = [0,1,2,3,4,5,6,8,9] var x= searchNum( arr ); console.log(x); function searchNum( arr ){ if( arr.length <=0 ) return false; var middleI = Math.floor(arr.length/2); for ( var i= 0,len=arr.length;i<middleI;i++ ){ if ( arr[middleI]-arr[middleI-1] > 1 ) { returnarr[middleI]-1; } else if( arr[middleI+1]-arr[middleI] > 1 ){ return arr[middleI]+1; } else { if( arr[i] + arr[len-i-1] !== 9 ){ if( arr[i]-arr[i-1] !== 1 ){ return arr[i]-1; } else if( arr[len-i] + arr[len-i-1] !== 1 ){ return arr[len-i-1]+1; } break; } } } }
網友如果有更優的方法,歡迎吐槽評論共賞
相關推薦
在按順序遞增的陣列中查詢缺少的某一個數字
題目是這樣的: 給出一個數組arr內容是0-99的數字,從中間隨機取出一個數字x,剩下的數字在陣列arr中遞增排序,求:使用最優的方法從陣列arr中找到隨機取出的x是多少 下面寫的是js語法形式 方法一: 這是最笨也是最普通的方法,時間複雜度為O(n),for迴圈整個
迴圈遞增陣列中查詢是否存在某個數
#include <cassert> #include <iostream> using namespace std; // 在迴圈遞增陣列中檢視是否存在某個數 // 返回-1表示陣列中沒有該元素 int search(int arr[], int
在有序遞增陣列中查詢一個缺少的數字
例如2,3,4,5,6,8,9.在這個陣列中我們要找到缺少的7。從直覺上看,我們可以把2到9求和,然後把陣列的成員求和。用數字的和減去陣列的和得到的就是缺少的數字。但是這個辦法的時間複雜度是O(n)。但是我們看到陣列是有序的,能不能通過二分法找到數字呢,答案是肯定的。我們可
關於一個查詢陣列中是否存在某一個元素的問題
最近遇到一個問題: 查詢陣列中是否存在一個元素,存在則輸出,不存在則輸出查無資訊的問題。開始的時候寫的時候只是遍歷一下看看是否存在這個元素,然後else一下,發現並沒有達到預期效果,最後查找了一些資料發現需要定義一個布林型變數來進行。程式碼如下: boole
根據陣列中物件的某一個屬性值進行排序
ort方法接收一個函式作為引數,這裡巢狀一層函式用來接收物件屬性名,其他部分程式碼與正常使用sort方法相同 var arr = [ {name:'zopp',likeSum:6}, {name:'gpp',likeSum:6}, {name:'yjj',likeSum:6
在一個有序陣列中查詢具體的某個數字n
思路: 1.給定一個有序陣列(陣列元素排列有序,升序或者降序) 2.給定一個數字,查詢這個數字是否在陣列中,若存在則返回這個數字的下標 #include <stdio.h> #include <stdlib.h> int main() { int arr[] = {
js sort方法根據陣列中物件的某一個屬性值進行排序(實用方法)
js sort方法根據陣列中物件的某一個屬性值進行排序 sort方法接收一個函式作為引數,這裡巢狀一層函式用來接收物件屬性名,其他部分程式碼與正常使用sort方法相同. var arr = [ {name:'zopp',age:0}, {name:'gpp',age:18}, {n
js 根據陣列中物件的某一個屬性值進行排序
var arr = [ {name:'zopp',age:0}, {name:'gpp',age:18}, {name:'yjj',age:8} ]; compare = (property) => { return function(a,b){
寫程式碼可以在整型有序陣列中查詢想要的數字
使用二分法查詢會大大提高效率,不需用遍歷陣列中每一個元素的值 首先解釋二分法 假設要找的數字是5,從12個數中尋找,會先找12的一半6,判斷是大了,於是知道了要找的數字在左邊0——6之間,再取半得到3,是小了,於是在3—6之間再折半為4(為什麼是4,是因為三到六最中的數是4.5,
在整形有序的陣列中查詢想要的數字,找到了返回數字下標,沒找到返回-1,折半查詢
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char arr[] = { 1, 2, 3, 4, 5, 8, 9, 10 ,20}; int to_find = 5;
在整型有序陣列中查詢想要的數字, 找到了返回下標,找不到返回-1.(折半查詢)
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int BinarySearch(int a[], int key, int len) { int ret = -1;//找
題目:寫程式碼可以在整型有序陣列中查詢想要的數字, 找到了返回下標
程式碼: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //2.寫程式碼可以在整型有序陣列中查詢想要的數字, 找到了返回下標,找不到返回 - 1.(折半查詢) //定義一個整形有序陣列a[],設定左端點值和右端點值,兩者
二分查詢(在整型有序陣列中查詢想要的數字,找到了返回下標,找不到返回
在整型有序陣列中查詢想要的數字,找到了返回下標,找不到返回 - 1#include<stdio.h> #include<Windows.h> int binary_search(int arr[]
【C語言】寫程式碼可以在整型有序陣列中查詢想要的數字,找到了返回下標,找不到返回-1.(折半查詢)
定義一個數組,設定它的左右下標,同時定義一箇中間下標mid,每次進行折半查詢,若要查詢的數比mid小,則右下標等於mid-1,若要查詢的數比mid大,則左下標等於mid+1。若要查詢的數等於mid,則迴圈停止。 #include<stdio.h> #include<string
js sort方法根據陣列中物件的某一個屬性值進行排序
sort方法接收一個函式作為引數,這裡巢狀一層函式用來接收物件屬性名,其他部分程式碼與正常使用sort方法相同. var arr = [ {name:'zopp',age:0}, {name:'gpp',age:18}, {name:'yjj',age:8} ]; functio
面試突擊 | Redis 如何從海量資料中查詢出某一個 Key?附視訊
1 考察知識點 本題考察的知識點有以下幾個: Keys 和 Scan 的區別 Keys 查詢的缺點 Scan 如何使用? Scan 查詢的特點 2 解答思路 Keys 查詢存在的問題 Scan 的使用 Scan 的特點 3 Keys 使用相關 1)Keys 用法如下 2)Keys 存在的問題
先宣告一個數組int[] arr,初始化長度為5 從鍵盤輸入數字存到陣列中,每輸入一個數字,詢問是否繼續(Y/N),如果是Y,就繼續,直到輸入N結束輸入 如果陣列存滿了,要實現陣列擴容的效果(提示,新
package com.atguigu.java; import java.util.Scanner; public class TextJava{ public static void main(String[] args){ Scanner input =
資料結構-陣列-找出陣列中第二小的一個數字
思路整理: 這個問題的處理思路有兩個: 1,把陣列排序。排序演算法中效率最高的時間複雜度為O(nlnogn) 2,遍歷陣列,找出最小的兩個數字。時間複雜度為O(n) 下面我們用第二種方法來處理這個問題。 /** * 找出陣列中第二小的一個數字 */ public clas
//楊氏矩陣 有一個二維陣列. 陣列的每行從左到右是遞增的,每列從上到下是遞增的. 在這樣的陣列中查詢一個數字是否存在。
//楊氏矩陣 有一個二維陣列. 陣列的每行從左到右是遞增的,每列從上到下是遞增的. 在這樣的陣列中查詢一個數字是否存在。 時間複雜度小於O(N); 我用一個while迴圈實現了該要求 #include <stdio.h> #include <windows.h>
//楊氏矩陣 有一個二維陣列. 陣列的每行從左到右是遞增的,每列從上到下是遞增的. 在這樣的陣列中查詢一個數字是否存在
題目: //楊氏矩陣 有一個二維陣列. 陣列的每行從左到右是遞增的,每列從上到下是遞增的. 在這樣的陣列中查詢一個數字是否存在。 時間複雜度小於O(N); 陣列: 1 2 3 2 3 4