剑指offer31-35

Posted lgh544

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer31-35相关的知识,希望对你有一定的参考价值。

31把数组排成最小的数

  输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

 

比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1那个大,如果s1+s2大,那说明s2应该放前面,所以按这个规则,s2就应该排在s1前面

public class PrintMinNumber_31 {

    public static void main(String[] args) {
        PrintMinNumber_31 min = new PrintMinNumber_31();
        int[] num = {3,32,321};
        String res = min.PrintMinNumber(num);
        System.out.println(res);
    }
    public String PrintMinNumber(int[] numbers) {
        for(int i = 0; i < numbers.length; i++) {
            for(int j = i + 1; j < numbers.length; j++) {
                int sum1 = Integer.valueOf(numbers[i]+""+numbers[j]);
                int sum2 = Integer.valueOf(numbers[j]+""+numbers[i]);
                if(sum1 > sum2) {
                    int temp = numbers[i];
                    numbers[i] = numbers[j];
                    numbers[j] = temp;
                }
            }
        }
        String str = "";
        for(int i = 0; i < numbers.length; i++) {
             str += numbers[i]+"";
        }
        return str;
    }

}

32丑数

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。


丑数能够分解成2^x3^y5^z,
所以只需要把得到的丑数不断地乘以2、3、5之后并放入他们应该放置的位置即可,
而此题的难点就在于如何有序的放在合适的位置。
1乘以 (2、3、5)=2、3、5;2乘以(2、3、5)=4、6、10;3乘以(2、3、5)=6,9,15;5乘以(2、3、5)=10、15、25;
从这里我们可以看到如果不加策略地添加丑数是会有重复并且无序,
而在2x,3y,5z中,如果x=y=z那么最小丑数一定是乘以2的,但关键是有可能存在x》y》z的情况,所以我们要维持三个指针来记录当前乘以2、乘以3、乘以5的最小值,然后当其被选为新的最小值后,要把相应的指针+1;因为这个指针会逐渐遍历整个数组,因此最终数组中的每一个值都会被乘以2、乘以3、乘以5,也就是实现了我们最开始的想法,只不过不是同时成乘以2、3、5,而是在需要的时候乘以2、3、5.

public class GetUglyNumber_32 {

    public static void main(String[] args) {
        GetUglyNumber_32 ugly = new GetUglyNumber_32();
        int index = 7;
        int res = ugly.GetUglyNumber_Solution(index);
        System.out.println(res);
    }
    public int GetUglyNumber_Solution(int index) {
        int[] result = new int[index];
        int p2 = 0; int p3 = 0; int p5 = 0;
        result[0] = 1;
        for(int i = 1; i < index; i++) {
            result[i] = Math.min(result[p2]*2,Math.min(result[p3]*3, result[p5]*5));
            if(result[i] == result[p2]*2)p2++;
            if(result[i] == result[p3]*3)p3++;
            if(result[i] == result[p5]*5)p5++;
        }
        return result[index-1];
    }

}

33第一个只出现一次的字符

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)

public class FirstNotRepeatingChar_33 {

    public static void main(String[] args) {
        FirstNotRepeatingChar_33 first = new FirstNotRepeatingChar_33();
        String s = "abcbcjAa";
        int res = first.FirstNotRepeatingChar(s);
        System.out.println(res);
    }

    public int FirstNotRepeatingChar(String s) {
        if (s.length() == 0)
            return -1;
        int[] count = new int[123];
        for(int i = 0; i < s.length(); i++) {
            count[s.charAt(i)]++;
        }
        for(int i = 0; i < s.length(); i++) {
            if(count[s.charAt(i)] == 1) {
                return i;
            }
        }
        return -1;
    }

}

 

以上是关于剑指offer31-35的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

剑指 Offer(第 2 版)完整题解笔记 & C++代码实现(LeetCode版)

剑指 Offer(第 2 版)完整题解笔记 & C++代码实现(LeetCode版)

LeetCode(剑指 Offer)- 14- I. 剪绳子

LeetCode(剑指 Offer)- 14- I. 剪绳子

剑指offer——第二十九天(动态规划“困难”)