劍指offer面試題目 數字在排序陣列中出現的次數

2021-08-04 14:43:58 字數 1299 閱讀 7699

統計乙個數字在排序陣列中出現的次數。例如,輸入排序陣列和數字3由於3在這個陣列中出現了4次,因此輸出4。

題目解法很多,關鍵是要找到讓人滿意的方法,直接統計當然可以,可是顯然不是我們要的答案。

比較好的思路如下:

使用二分查詢的拓展,當查詢的元素有重複的時,找到元素的第乙個和最後乙個。這樣將可以計算出該元素有多少個重複的了。二分法在陣列中查詢乙個合乎要求的數字時間複雜度是o(logn),因此總的時間複雜度也只有o(logn)。

int getfirstk(int *data, int length, int k, int start, int end)  

else

} else

if (middledata>k)

else

start=middleindex+1;

//遞迴

return getfirstk(data,length,k,start,end);

} //同樣的思路,遞迴找到最後的乙個k

int getendk(int *data, int length, int k, int start, int end)

else

start=middleindex+1;

} else

if (middledata>k)

else

return getendk(data,length,k,start,end);

} //計算出k在陣列中出現的次數

int getnumofk(int *data, int length, int k)

} return

number;

}

上面的採用了遞迴,下面採用迴圈效果更好,但解題思路一樣。

#include

#include

//全域性變數

int arr = ; //測試陣列

int size = sizeof(arr) / sizeof(*arr); //陣列元素個數

int getupper(int arr, int key)

// 返回最後出現位置

return low;

}int getlower(int arr, int key)

//返回第一次出現位置

return low;

} int main()

劍指offer面試題目 醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。輸入 輸入包括乙個整數n 1 n 1500 輸出 可能有多組測試資料,對於每組資料,輸出第n個醜數。方法一 最簡單的思路是,從...

劍指offer 面試題三 題目二

在乙個長度為n 1的陣列裡的所有數字都在1到n的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3。我們新建乙個陣列,將陣列中的每乙個數字m,放到新陣列下標為m的位置,如果有重複,說明有重複...

劍指offer面試題7

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