顺序表vector--------练习题8题解

前言

今天去了一家有故事的猫咖,里面的猫猫狗狗来自我们本地的一个流浪猫狗收容所,在他们的留言墙上我看到了那个慈祥的大姨,她是这些猫猫狗狗的妈妈,她心中又有什么样的信仰和信念支撑和驱动着她去不知劳累的干这些事情呢。

题目

解法1

class Solution {
public:
    int sumIndicesWithKSetBits(vector<int>& nums, int k) {
        int sum=0;
        int is,iy;
        for(int i=0;i<nums.size();i++){
            int cnt=0;
            is=i;
            while(is>0){
                iy=is%2;
                is=is/2;
                if(iy==1){
                    cnt++;
                }
            }
            if(cnt==k){
                sum+=nums[i];
            }   
        }
        return sum;
    }
};

这是我本人的思路,通过十进制转二进制的方法,通过每一次将索引除以二,看余数是否为1,是则让cnt++,否则不变,然后继续用除以二得到的商重复以上操作,直到商等于0,然后比较cnt和k,如果相等则符合条件,加到sum里面,最终遍历完每一个索引以后,返回sum的值。

解法2

class Solution {
public:
    int sumIndicesWithKSetBits(vector<int>& nums, int k) {
        int sum=0;
        int is,iy;
        for(int i=0;i<nums.size();i++){
            int cnt=0;
            is=i;
            while(is){
                if(is&1){
                    cnt++;
                }
                is = is>>1;
            }
            if(cnt==k){
                sum+=nums[i];
            }   
        }
        return sum;
    }
};

这是老师的思路,结合位与运算和右移运算,减少代码长度,更加简便。

位于运算即相同为1,不同为0,利用它可以判断最后一位是否为1;

右移运算即让索引对应的二进制数向右移动一位,左边补0,比如111->011.

反思

1.考察知识点:二进制到十进制的转换,位运算

2.踩的坑:对二进制转十进制不熟悉

3.可以优化的地方:利用位运算优化代码

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值