今天开始打卡学习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相加就可以得到相同的数,也就是猜对次数。