小白leetcode之路之22/09/22

今天开始打卡学习leetcode,因为是小白,所以从基础题开始吧

题目1

解题思路:因为是主要判断是奇数还是偶数,所以很容易能想到通过对2进行取余判断奇偶。

class Solution {

public:

    int smallestEvenMultiple(int n) {

        if( n % 2 == 0) return n;

        else return 2*n;

        

    }

};

观察高赞答案:

class Solution {
public:
    int smallestEvenMultiple(int n) {
        if (n & 1) return n * 2;
        else return n;
    }
};

&是位与操作符,n&1,不是将n的二进制形式与00000000 00000001按位做与操作。这时,只要n的最右边一位是1,结果就不是0,为true,条件成立。所以这句话实际上就是if(n%2==1),很巧妙的思路值得一赞

题目2:

小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?

输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3。

示例 1:

输入:guess = [1,2,3], answer = [1,2,3]
输出:3
解释:小A 每次都猜对了。
示例 2:

输入:guess = [2,2,3], answer = [3,2,1]
输出:1
解释:小A 只猜对了第二次。
 

限制:

guess 的长度 = 3
answer 的长度 = 3
guess 的元素取值为 {1, 2, 3} 之一。
answer 的元素取值为 {1, 2, 3} 之一。

解题思路:依次对该数组的内容进行比对,用变量count来保存每次比对结果,成功加1,失败无变化,通过for循环去实现,但是存在空间复杂度较高的问题。

解题:

class Solution {

public:

    int game(vector<int>& guess, vector<int>& answer) {

        int count = 0;

       

        for( int i = 0; i < 3;i++)

        {

            if (guess[i] == answer [i]) count++;

        }

        return count;

    }

};

高赞回答:

class Solution {
public:
    int game(vector<int>& guess, vector<int>& answer) {
        return !(guess[0]^answer[0]) + !(guess[1]^answer[1]) + !(guess[2]^answer[2]);
    }
};

这个解答非常巧妙,实际上通过^这个异或符号来对两个数组的每一位数字按位进行异或。相同就等于0,这样如果此次比较完全相同则得到二进制数0,再通过上述的非符号进行取非获得1,把多个1相加就可以得到相同的数,也就是猜对次数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值