思路:因为2的幂的二进制只含有一个1,比如4:100,3则为011,所以按位&就能得到全为000.
class Solution {
public:
bool isPowerOfTwo(int n) {
return n>0&&!(n&(n-1));
}
};
思路:
class Solution {
public:
bool isPowerOfTwo(int n) {
return n>0&&(1<<30)%n==0;
}
};
思路:挺有意思的题目,2,3,5为所有后续丑数构成因子,所以每次对原来丑数乘以构成因子并选出最小的那位,比如2*2=4,2*3=6,2*5=10,这次是采用3指针的方式,依次得到2,3,4,5,6,8...挺有意思的
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> res(1,1);
int idx3 = 0;
int idx2 = 0;
int idx5 = 0;
int i = 1;
while(i++<n)
{
int tmp = min(2*res[idx2],min(3*res[idx3],5*res[idx5]));
res.push_back(tmp);
if(tmp==2*res[idx2]) idx2++;
if(tmp==3*res[idx3]) idx3++;
if(tmp==5*res[idx5]) idx5++;
}
return res.back();
}
};
思路:这题更加有意思,emmm,题意简述就是编号为第i次的倍数的灯,状态会被改变,比如第2次,改变的是2,4,6等处的灯,如果一个灯被连续改变2次则状态不变还是黑色,比如8就能在1,8,2,4处改变,如果存在平方数,比如4,在1,4,处改变,但是由于存在平方数 2*2=4,所以有一次是没有翻转过来的,所以只需要求<=n,且具有平方数的个数就可以啦,所以答案就是sqrt(n)
class Solution {
public:
int bulbSwitch(int n) {
return sqrt(n);
}
};
思路:裸二分
class Solution {
public:
bool judgeSquareSum(int c) {
long long left = 0;
long long right = sqrt(c);
while(left<=right)
{
long long sum = left*left+right*right;
if(sum==c) return true;
else if(sum>c) right--;
else left++;
}
return false;
}
};
思路:z = a*x+b*y ,设(x,y)的最小公约数为g,则z = a*m*g+b*n*g=(am+bn)*g。若使得式子成立则z%g==0.即z=l*g。所以比较简单了
class Solution {
public:
int gcd(int n,int m)
{
return n%m==0?m:gcd(m,n%m);
}
bool canMeasureWater(int x, int y, int z) {
if(x+y<z) return false;
if(x==z||y==z||x+y==z) return true;
return z%gcd(x,y)==0?true:false;
}
};
思路:关键每次求交集即为最小的子串长度
class Solution {
public:
vector<string> commonChars(vector<string>& A) {
vector<int> nums(26,INT_MAX);
vector<int> nums_cur;
int size = A.size();
for(int i=0;i<size;i++){
nums_cur = vector<int> (26,0);
for(int j=0;j<A[i].size();j++){
nums_cur[A[i][j]-'a']++;
}
for(int k=0;k<26;k++){
nums[k] = min(nums[k],nums_cur[k]);
}
}
vector<string> res;
string str="";
for(int k=0;k<26;k++){
str = "";
str.push_back((char)(k+'a'));
while(nums[k]--){
res.push_back(str);
}
}
return res;
}
};
思路:水水。。如果反复query肯定会超时,所以每次更改一个数字其实都只对和产生影响,所以先求出s,然后求每一步改变对s的影响
class Solution {
public:
vector<int> sumEvenAfterQueries(vector<int>& A, vector<vector<int>>& q) {
vector<int> res;
int sum = 0;
for(int i=0;i<A.size();i++)
{
if(A[i]%2==0) sum+=A[i];
}
for(int i=0;i<q.size();i++)
{
int tmp = A[q[i][1]]; //source
A[q[i][1]]+=q[i][0];
if(tmp%2==0)
{
if(A[q[i][1]]%2==0) res.push_back(sum+=(A[q[i][1]]-tmp));
else res.push_back(sum-=tmp);
}
else
{
if(A[q[i][1]]%2==0) res.push_back(sum+=A[q[i][1]]);
else res.push_back(sum);
}
}
return res;
}
};