《劍指offer》陣列相關面試題

2021-08-30 11:00:05 字數 1442 閱讀 1672

在乙個長度為n的陣列裡所有數字都在0~n-1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複,也不知道重複了幾次,請找出陣列中任意乙個重複的數字。例如,長度為7的陣列,那麼對應的輸出應該是重複的數字2或者3.

思路:重排這個陣列,從頭到尾依次掃瞄這個陣列中的每個數字。掃到下標為i的數字m時:首先判斷m是否等於i:是—掃瞄下乙個數字;不是—判斷它和第m個數字是否相等,若相等則找到了乙個重複數字,若不相等則交換下標為i和m的數字。

int duplication(int numbers,int length)

for(i=0;ilength-1)

return 0;

} for(i=0;i當輸入的陣列中存在重複數字返回1,否則返回0,演算法時間複雜度o(n),空間複雜度o(1).

長度為n+1的陣列裡所有數字在1-n內,故至少有乙個數字是重複的,找出陣列中任意乙個重複數字,例如

思路:將1-n從中間的數字m分為兩部分:1–m及m+1–n,若1+m中的數字出現次數大於m,則1–m中一定有重複數字,否則重複數字在m+1–n中,重新劃分區間直到找到重複數字。

int getduplication(const int numbers,int length)

while(end>=start)

if(count>(middle-start+1))

end = middle;

else

start = middle+1;

} return -1;

}int countrange(const int numbers,int length,int start,int end)

return count;

}

在乙個二維陣列中,每一行從左到右遞增,每一列從上到下遞增。輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。在如下陣列找7:

思路:

首先選取陣列右上角的數字,如果該數字等於要查詢的數字,則查詢過程結束:如果該數字大於要查詢的數,則剔除這個數字所在列;如果該數字小於要查詢的數,則剔除這個數字所在行。

int find(int* matrix,int rows,int columns,int number)

else if(matrix[r*columns+c]>number)

else

r++;

} }return 0;

}

也可以選取右上角和左下角的數字進行查詢,但不可以選擇左上角或右下角的進行查詢。

劍指offer面試題7

面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...

劍指offer面試題11

面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...

劍指offer面試題15

面試題15 鍊錶中倒數第k個結點 題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第乙個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。預備知識 鍊錶結點的定義如下 ...