1. 程式人生 > >在按順序遞增的陣列中查詢缺少的某一個數字

在按順序遞增的陣列中查詢缺少的某一個數字

題目是這樣的:

給出一個數組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 ) {

            return 
arr[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 存在的問題

資料結構-陣列-找出陣列第二小的一個數字

思路整理: 這個問題的處理思路有兩個: 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