例如,如果輸入長度為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哪個應...