《劍指Offer》第二版之陣列中重複的數字(二)

2021-09-20 13:03:01 字數 1085 閱讀 6556

目錄

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

思路: 從頭到尾依次掃瞄這個陣列中的每個數字。當掃瞄到下標為i的數字時,首先比較這個數字(用m表示)是不是等於i。如果是,則接著掃瞄下乙個數字;如果不是,則再拿它和第m個數字進行比較。如果它和第m個數字相等,就找到了乙個重複的數字(該數字在下標為i和m的位置都出現了);如果它和第m個數字不相等,就把第i個數字和第m個數字交換,把m放到屬於它的位置。接下來再重複這個比較、交換的過程,直到我們發現乙個重複的數字。

步驟: 1.陣列的第0個數字(從0開始計數,和陣列的下標保持一致)是2,與它的下標不相等,於是把它和下標為2的數字1交換。交換後的陣列是。

2.此時第0個數字是1,仍然與它的下標不相等,繼續把它和下標為1的數字3交換,得到陣列。

3.接下來繼續交換第0個數字3和第3個數字0,得到陣列。

4.此時第0個數字的數值為0,接著掃瞄下乙個數字。

**:

package test;

public class findarrayduplicate ;

system.out.println("找到重複數字: " + duplicate(numbers)); }

public static int duplicate(int numbers)

//如果陣列資料不在0~n-1,則直接返回-1

for (int i = 0; i < numbers.length; i++)

for (int i = 0; i < numbers.length; i++)

//如果它和第m個數字不相等,就把第i個數字和第m個數字交換,把m放到屬於它的位置

int temp = numbers[i];

numbers[i] = numbers[temp];

numbers[temp] = temp;

}} return -1;

}}

注:該演算法的時間複雜度為o(n),空間複雜度為o(1)。

劍指offer第二版易錯總結P1

必須要new乙個dummy,而不是直接建立乙個listnode 具體原因 非常規的解法。這種思路只能通過60 的用例 definition for a binary tree node.struct treenode class solution 只需要加一句話 swap root left rig...

劍指offer第二版 面試題6(java)

面試題6 從尾到頭列印鍊錶 題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值 鍊錶的結點定義如下 public class listnode 注意 面試中,如果打算修改輸入的資料,最好先問好是否資料是允許修改的 思路 1.遍歷順序從頭到尾,列印順序從尾到頭,第乙個結點最開始被訪問,但是最...

劍指offer第二版 面試題8 java

題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標 分析 情況 一 有右子樹,這時只需要把其右孩子作為下乙個遍歷的 並不是要找的 節點,然後沿著該節點的左子樹 如果有的話 出發,直到遇到葉子節點,那麼該葉子節...