劍指offer第八天
阿新 • • 發佈:2018-02-12
ins shm 位置 出現一次 ber 第八天 () get pos
32.把數組排成最小的數
輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字為321323。
解題思路:
- 實際是將數組元素進行排序的操作
- 排序規則為,若MN組成的數字大於NM,則N在前M在後
- 使用Comparatpr定制排序規則
- 考慮到數字連接起來可能使int溢出,所以轉換為使用String來操作。
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class Solution { public String PrintMinNumber(int [] numbers) { String result = ""; if(numbers == null || numbers.length == 0) return result; ArrayList<String> list = new ArrayList<>(); for(int i = 0 ;i < numbers.length;i++){ list.add(numbers[i]+""); } Collections.sort(list,new Comparator<String>(){ @Override public int compare(String sNum1,String sNum2){ String num1 = sNum1+sNum2; String num2 = sNum2+sNum1; return num1.compareTo(num2); } }); for(String str : list){ result += str; } return result; } }
33.醜數
把只包含因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。
public class Solution { public int GetUglyNumber_Solution(int index) { if(index <= 0 ) return 0; int mult2_Idx = 0,mult3_Idx = 0,mult5_Idx = 0; int[] uglyNumber = new int[index]; uglyNumber[0] = 1; for(int i = 1;i<index;i++){ int min = Math.min(Math.min(uglyNumber[mult2_Idx]*2, uglyNumber[mult3_Idx]*3), uglyNumber[mult5_Idx]*5); uglyNumber[i] = min; while(uglyNumber[mult2_Idx]*2 <= uglyNumber[i]) mult2_Idx++; while(uglyNumber[mult3_Idx]*3 <= uglyNumber[i]) mult3_Idx++; while(uglyNumber[mult5_Idx]*5 <= uglyNumber[i]) mult5_Idx++; } return uglyNumber[index-1]; } }
34.第一個只出現一次的字符
在一個字符串(1<=字符串長度<=10000,全部由字母組成)中找到第一個只出現一次的字符,並返回它的位置
import java.util.HashMap; public class Solution { public int FirstNotRepeatingChar(String str) { int result = Integer.MAX_VALUE; if(str.length() == 0) return -1; HashMap<Character,Integer> charIdx = new HashMap<>(); for(int i = 0 ;i < str.length(); i++){ Character c = str.charAt(i); if(charIdx.containsKey(c)){ charIdx.put(c,-1); }else{ charIdx.put(c,i); } } for(int index : charIdx.values()){ if(index != -1){ result = Math.min(result,index); } } return result; } }
劍指offer第八天