剑指Offer 49 50

263 阅读1分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

剑指 Offer 49. 丑数

题目

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

示例:

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

说明:

  1. 1 是丑数。
  2. n 不超过1690。

方法一

朴素方法:根据丑数的定义,只包含质因子2,3,5的数,那么我们可以根据第一个丑数1来生产出后面所有的丑数,因为只包含质因子2,3,5,所以我们给分别把最小的丑数1乘上质因子2,3,5,那么就生产出了3个丑数;

题目求的是从小到大的第n个丑数,我们可以根据上面生产丑数的方法,每次将生产出来的三个数中的最小的丑数,加入到数组中用于后续生产;设置三个指针,分别指向三个质因子当前用到哪个丑数来生产;

class Solution {
    public int nthUglyNumber(int n) {
        int[] res = new int[n];
        res[0] = 1;
        int i = 0, j = 0, k = 0, len = 1;
        while(len < n) {
            int t = Math.min(2 * res[i], Math.min(3 * res[j], 5 * res[k]));
            if (2 * res[i] == t) i ++;
            if (3 * res[j] == t) j ++;
            if (5 * res[k] == t) k ++;
            res[len ++] = t;
        }
        return res[n - 1];
    }
}

时间复杂度: O(n)

空间复杂度: O(n)

剑指 Offer 50. 第一个只出现一次的字符

题目

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

示例:

s = "abaccdeff"
返回 "b"
​
s = "" 
返回 " "

限制:

0 <= s 的长度 <= 50000

方法一

哈希表:遍历一遍字符串,记录每个字符出现的次数;第二遍从头开始遍历,发现该字符出现的次数为1,返回该字符;否则,说明没有只出现一次的字符,返回' '

class Solution {
    public char firstUniqChar(String s) {
        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i ++ )
        {
            char c = s.charAt(i);
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
​
        for (int i = 0; i < s.length(); i ++ )
            if (map.get(s.charAt(i)) == 1)
                return s.charAt(i);
        return ' ';
    }
}

时间复杂度: O(n)

空间复杂度: O(1)