zoukankan      html  css  js  c++  java
  • 剑指offer第八天

    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;
        }
    }
    
  • 相关阅读:
    二值形态学——开、闭运算
    二值形态学——腐蚀与膨胀 及 C语言代码实现
    数学形态学处理-基本符号和术语
    【OpenCV】图像增强---灰度变换、直方图均衡化
    【OpenCV】【MFC】图片、视频、摄像头输入响应【详细图解】
    【OpenCV】三种方式操作图像像素
    【OpenCV】透视变换矫正
    数字图像处理基础
    Voronoi图及matlab实现
    粒子群优化算法PSO及matlab实现
  • 原文地址:https://www.cnblogs.com/guoyaohua/p/8443481.html
Copyright © 2011-2022 走看看