算法刷题小结

本文探讨了三个编程问题的解决方案:1) 计算数位和并统计相同和数的组数量;2) 使用递归计算数字相加直至得到一位数;3) 汉明重量计算,即找出二进制表示中1的个数。通过哈希表、递归等方法,展示了如何高效解决这些算法挑战。
摘要由CSDN通过智能技术生成

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值