1.LeetCode1399
给你一个整数 n 。请你先求出从 1 到 n 的每个整数 10 进制表示下的数位和(每一位上的数字相加),然后把数位和相等的数字放到同一个组中。
请你统计每个组中的数字数目,并返回数字数目并列最多的组有多少个。
思路:使用哈希表建立一个从数位和到原数字的哈希映射,对每一个数字 ,使键对应的值自增1。然后我们在值的集合中找到最大的值 m,再遍历哈希表,统计值为 m 的个数就可以了。
class Solution {
public int countLargestGroup(int n) {
Map <Integer,Integer> hashMap = new HashMap<>();
int max = 0;
for(int i = 0; i <= n; i++){
int key = 0, m = i;
while(m != 0){
key += m % 10;
m /= 10;
}
hashMap.put(key,hashMap.getOrDefault(key,0) + 1);
//指定的key并不存在映射关系中,则返回的该默认值
max = Math.max(max,hashMap.get(key));
}
int count = 0;
for(Map.Entry<Integer,Integer> kv : hashMap.entrySet()){
//返回映射中包含的映射的 Set 视图
if (kv.getValue() == max) {
count++;
}
}
return count;
}
}
时间复杂度: O(nlogn)
2.相位相加
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
思路:递归直接干吧!!!
class Solution {//递归...
public int addDigits(int num) {
if(num / 10 == 0){
return num;
}
int sum = 0;//计数
while(num != 0){
sum += num% 10 ;
num/=10;
}
return addDigits(sum);
}
}
3.剑指 Offer 15. 二进制中1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。
思路:当检查第 i 位时我们可以让n与2^i 进行与运算,当且仅当n的第i位为1 时,运算结果不为0。
public class Solution {//
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
/**思路:
当检查第 i 位时我们可以让n与2^i 进行与运算,当且仅当n的第i位为 时,运算结果不为0*/
int count = 0;
for(int i = 0; i < 32; i++){
if ((n & (1 << i)) != 0){//与运算
count++;
}
}
return count;
}
}