1. 程式人生 > >劍指offer第八天

劍指offer第八天

ins shm 位置 出現一次 ber 第八天 () get pos

32.把數組排成最小的數

輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字為321323。

解題思路:

  1. 實際是將數組元素進行排序的操作
  2. 排序規則為,若MN組成的數字大於NM,則N在前M在後
  3. 使用Comparatpr定制排序規則
  4. 考慮到數字連接起來可能使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第八天