面試題整理 最小沒出現的整數

2021-09-25 15:17:21 字數 1344 閱讀 8875

題目:#面試題#給定乙個無序的整數陣列,怎麼找到第乙個大於0,並且不在此陣列的最小整數。比如[1,2,0] 返回 3, [3,4,-1,1] 返回 2。最好能o(1)空間和o(n)時間。

**解法:直接考慮這個問題是比較困難的。不如先換個簡單的問題。

問題1給定乙個陣列,長度為n,除a[0]以外,其他元素都是a[i] == i。那麼請找出第乙個大於0,且不在此陣列中的最小整數。

答案就是:  n + (a[0] == n);

問題2給定乙個陣列,長度為n,某幾個位置的元素滿足 a[x] < 0 或者 a[x] > n,餘下的元素都滿足a[i] == i。那麼請找出第乙個大於0,且不在此陣列中的最小整數。

答:很明顯:當x的值限定為0時。就變成了問題1。

除此之外,這個問題的解也容易求得。

情況1: 首先從1~n開始掃瞄,當發現i != a[i]時,直接返回i。此時的i必定是最小的未出現的整數。

情況2: 當掃瞄完1~n之後,那麼就回歸至問題1了。

for (i = 1; i < n; ++i) 

return (n + (n == a[0]));

問題3

當給出問題2之後,就需要考慮如何把原題目轉換成為問題2了。

實際上要完成的任務就變成了,如何把乙個陣列中的元素元神歸位。也就是讓a[i] == i。如果能讓這些元素元神歸位,那麼就轉換成為問題2了。就很容易求解了。

演算法如下:

我們從後往前掃瞄,i = n - 1 to 0;

step1如果發現a[i] < 0 || a[i] > n; 則 continue;

step2 如果發現a[i] == a[a[i]]; 則continue;

step3 如果發現0 < a[i] < n

說明需要將a[i]元神歸位。也就是放到a[a[i]]上去。

swap(a[i], a[a[i]]).

再跳轉至step2。

note: 需要注意一種有重複數的情況,比如a[11] = 2, a[2] = 2。這時候,就不用進行交換了。直接處理下乙個元素。

可以給出**:

int i = n, t, temp;

if (!a || n <= 0) return -1;

while ((--i) >= 0)

}

原題解答

int find(int *a, int n) 

}for (i = 1; i < n; ++i)

if (a[i] != i) return i;

return (n + (a[0] == n));

最小沒出現的整數

自 題目 面試題 給定乙個無序的整數陣列,怎麼找到第乙個大於0,並且不在此陣列的最小整數。比如 1,2,0 返回 3,3,4,1,1 返回 2。最好能o 1 空間和o n 時間。解法 直接考慮這個問題是比較困難的。不如先換個簡單的問題。問題1 給定乙個陣列,長度為n,除a 0 以外,其他元素都是a ...

面試題整理

2014.3.19日整理 1.建立一張表hack 裡面就乙個欄位num,然後用sql語句從1開始插入到100,怎麼寫?oracle 答 1.create tablehack num number 建表語句 2.begin for i in1.100loop insert intohack num v...

整理面試題

整理面試題 1 說說activity,intent,service是什麼關係 答 乙個activity 通常是乙個單獨的螢幕,每乙個 activity 都被實現為乙個單獨的類,這些類都是從 activity 基類中繼承而來的。activity 類會顯示由檢視控制項組成的使用者介面,並對檢視控制項的事...