面試題:在排序陣列中查詢數字
題目一:求數字在排序陣列**現的次數
題目二:求0~n-1中缺失的數字
題目三:求陣列中數值=下標的元素
具體題目:
題目一中,統計乙個數字在排序陣列**現的次數
題目二中,長度n-1的遞增排序陣列中,所有數字都是唯一的,且每個數字都在0~n-1之內,在0~n-1內的n個數字有且只有乙個數字不在陣列中,找出該數
題目三中,單調遞增陣列,陣列中每個元素都是整數並且是唯一的,找出陣列中任意乙個數值等於其下標的元素
思路:
題目一:查詢數字x的次數
如果從頭開始查詢,從查詢到x開始計數,則時間複雜度為o(n)
如果使用二分查詢演算法,找到陣列中的乙個x,但是查詢到的位置可能兩邊都還有x,所以需要從查詢到的位置分別往前遍歷和往後遍歷,這個演算法的時間複雜度也是o(n)
因此,可以使用二分查詢演算法,分別查詢陣列中x的開頭位置和結束位置:
1. 用二分查詢法查詢開頭位置 start
如果所查詢的子陣列(陣列)的中間位置為a>x,則將查詢的子陣列設定為該位置左邊的部分;如果所查詢的子陣列(陣列)的中間位置的a如果所查詢啊的子陣列(陣列)的中間位置a=x,則檢查當前位置的前面乙個數,看其是否為x,如果a前面的數不為x,則a的位置為x的開頭位置;如果a的前乙個數也為x,則將子陣列設定為【上一輪子陣列開頭到a前面位置】
2. 用二分查詢法查詢末尾位置 end
【當a!=x時 與1.相同】如果所查詢的子陣列(陣列)的中間位置為a>x,則將查詢的子陣列設定為該位置左邊的部分;如果所查詢的子陣列(陣列)的中間位置的a如果位置上的a>下標如果所查詢啊的子陣列(陣列)的中間位置a=x,則檢查當前位置的後面乙個數,看其是否為x,如果a後面的數不為x,則a的位置為x的結尾位置;如果a的後乙個數也為x,則將子陣列設定為【a後面一位到上一輪子陣列結尾】
3. 出現次數為end - start +1
題目二:
因為陣列長度為n-1,且從0~n-1遞增,所以缺失的數之前的其他數的下標=數,缺失數之後的數是下標《數
方法與題目一相似,用二分法進行查詢
如果當前位置的數a=下標,則說明要查詢的缺失數x在a的右邊;
如果當前位置的數a>下標,則需要判斷當前位置是否為缺失數的位置——如果當前位置的前一位滿足下標=數,則當前位置為缺失的位置;否則,缺失的位置在a左邊,繼續查詢。
題目三:
使用二分查詢法進行查詢時:
如果位置上的a=下標,為查詢的位置
如果位置上的a>下標——如果a左邊的數不滿足a=下標,則需要查詢的數在a的左邊(因為右邊的數都大於a,所以肯定都是數>下標);
如果位置上的a<下標——如果a右邊的數不滿足a=下標,則需要查詢的數在a的右邊(因為a左邊的數都小於a,所以肯定都是數<下標),迴圈直到找到符合條件的數(位置)
**:
題目一:
public class q53_1 ;
system.out.println(numofnum(list,1)); }
public static int numofnum(int list,int x)
system.out.printf("there is no %d\n",x);
return -1;
} public static int startoflist(int list,int x)
if(list[i]=start)
if(list[i]題目二:
public class q53_2 ;
int loc = lostnum(list);
if(loc!=-1)
system.out.printf("lost:%d\n",loc); }
public static int lostnum(int list)
if(list[i]>i) else else }}
} system.out.println("no number lost!");
return -1;
}}
題目三:
public class q53_3 ;
int loc = equalloc(list);
if(loc!=-1) }
public static int equalloc(int list)
if(list[i]i) else else }}
} system.out.println("no equal loc!");
return -1;
}}
劍指offer第二版 面試題6(java)
面試題6 從尾到頭列印鍊錶 題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值 鍊錶的結點定義如下 public class listnode 注意 面試中,如果打算修改輸入的資料,最好先問好是否資料是允許修改的 思路 1.遍歷順序從頭到尾,列印順序從尾到頭,第乙個結點最開始被訪問,但是最...
劍指offer第二版 面試題8 java
題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標 分析 情況 一 有右子樹,這時只需要把其右孩子作為下乙個遍歷的 並不是要找的 節點,然後沿著該節點的左子樹 如果有的話 出發,直到遇到葉子節點,那麼該葉子節...
劍指offer第二版 面試題9(java)
面試題9 用兩個棧實現佇列 題目描述 方法 兩個棧 stack1 stack2 插入時,直接放入stack1 刪除時,直接彈出pop2中的物件 如果pop2為空,則先將pop1中的物件放入stack2中,再從stack2裡pop第乙個 如 依次放入stack1中1 2 3,在彈出並放入stack2中...