劍指offer45 找到陣列重複元素

2021-07-15 01:27:56 字數 1517 閱讀 4051

例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字3。

三、思想

(1)第一種解題思路就是採用逐個比較的方式

(2)第二種方式就是使用先排序後查詢的方式,這樣能很大的提高查詢的效率

(3)第三種方式,也是醉巧妙的方式,是利用元素範圍再(0--n-1)的特點來進行查詢的,利用元素的下標和元素的對應與否來判

斷是否有重複的元素,如果元素的下標和元素不對應如num[i] != i 時,進行交換。看下面的例子:

陣列為例,num[0] = 2,那麼num[0] 就和 num[2] 交換,正好是0了,這是排序為,後邊正好不用動了,當掃

描到num[4]時,num[4] = 2,也就是 num[i] == num[num[i]],所以有相同元素了,可以返回。

package 劍指offer;

/*題目:在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,

*也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。*/

public class test50 ;

system.out.println(findcommonelement1(num1));

int num2 = new int;

system.out.println(findcommonelement1(num2));

system.out.println("********************===");

// 使用第二種比較聰明的方式

int num3 = new int;

system.out.println(findcommonelement1(num3));

int num4 = new int;

system.out.println(findcommonelement1(num4)); }

public static int findcommonelement1(int num)

int temp = new int[10];

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

}} return 0; }

public static int findcommonelement2(int num)

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

// 如果不同就交換

else }}

return 0; }

public static void swap(int data, int x, int y)

}// 1、我的思路:建立另外乙個陣列用來存資料,每當該陣列加入乙個新資料之前就和前面所以的資料比較

// 如果沒有相同的資料就將資料加入陣列中,有相同的資料就直接返回了

// 2、正確的解題思路,先進行排序,排序之後就是很容易的事情了

// 3、由於沒有認真讀題目,其實還有更加簡便的方法,因為我們數字的範圍是(0--n-1)所以可以採用巧妙的交換方式

劍指offer 45 把陣列排成最小的數

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。思路1 根據全排列,將三個數字的全排列全寫出來,然後比較大小,這種辦法在數比較多時,效率不高。思路2 先比較前兩個數字m和n排列的大小 mn和n...

劍指Offer 45 把陣列排成最小的數

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例 輸入陣列,列印321323。排列出所有的組合,比較出最小的,輸出。時間複雜度 o n 空間複雜度 o n 考察最小組合的形式,遵從下面的規律 1 首位小的靠前 2 首位相同,次位小的靠前 3 位數少的靠前...

把陣列排成最小的數(劍指offer 45)

輸入乙個正整數陣列,把陣列裡所有的數拼接為乙個數,列印出能拼接出的所有數字中最小的乙個。比如輸入 輸出 321323.這道題其實是希望我們能找到乙個排序規則,陣列根據這個排序規則排列後能排成乙個最小的數。要確定排序規則,就要比較兩個數字,也就是給出兩個數字m n,我們需要確定乙個規則判斷m和n哪個應...