剑指offer-20200313

烈酒焚心 提交于 2020-03-17 06:31:11

20200313

题目 :丑数

我们把只包含因子2、3和5的数称为丑数。按从小到大的顺序的第n个丑数。

示例:

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

思路 :动态规划;需将前面的求得的丑数记录下来。后面的值等于前面的*2或*3或*5。

code

class Solution{
    public int nthUglyNumber(int n){
        int p2 = 0, p3 = 0, p5 = 0;
        int[] dp = new int[n];
        dp[0] = 1;//初始值
        for(int i=1;i<n;i++){
            //确保丑数从小到大排序。
            dp[i] = Math.min(dp[p2]*2,Math.min(dp[p3]*3,dp[p5]*5));
            if(dp[i]==dp[p2]*2) p2++;
            if(dp[i]==dp[p3]*3) p3++;
            if(dp[i]==dp[p5]*5) p5++;
        }
        return dp[n-1];
    }
}

题目 :第一个只出现一次的字符。如果没有,返回一个单空格。

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。

示例:

s = "abaccdeff"
返回 "b"

s = "" 
返回 " "

思路:利用哈希表,首先遍历,得到每个字符出现的次数,之后再次遍历,找出最先出现一次的字符。

class Solution{
    public char firstUniqChar(String s){
        char ans = ' ';
        //hashMap<Character,Integer>
        Map<Character,Integer> map = new HashMap<>();
        for(int i=0;i<s.length();i++){
            if(map.containsKey(s.charAt(i))){
                int count = map.get(s.charAt(i)) + 1;
                map.put(s.charAt(i),count);
            }else{
                map.put(s.charAt(i),1)
            }
        }
        //再次遍历字符串,找到第一个出现次数为1的返回
        for(int i=0;i<s.length();i++){
            if(map.get(s.charAt(i)) == 1){
                return s.charAt(i);
            }
        }
        return ans;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!