这是我参与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是丑数。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)