算法刷题小结

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(nlog⁡n)

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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_52230126/article/details/121460305