class Solution { public: int hammingWeight(uint32_t n) { int k=0; //统计次数 while(n>0){ n &= (n-1); //每次消掉一个1 k++; //统计消掉1的次数 } return k; } };
求 n! 中0的个数。
思路:计算0的个数,也就是计算10的个数,即计算包含的2和5组成的pair的个数,因为5的个数比2少,所以2和5组成的pair的个数由5的个数决定。
观察15! = 有3个5(来自其中的5, 10, 15), 所以计算15/5=3就可以。
25! = 有6个5(有5个5来自其中的5, 10, 15, 20, 25, 另外还有1个5来自25=(5*5)的另外一个5),
所以要循环计算n/5, 直到商为0。
class Solution { public: int trailingZeroes(int n) { int result = 0, k = 0; while(n>0){ k = n/5; //统计 n! 是5的几幂次 result += k; n = k; } return result; } };
螺旋矩阵:
class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if(matrix.empty() || matrix[0].empty()) return {}; int m = matrix.size(); //行数 int n = matrix[0].size(); //列数 vector<int> res; int up = 0, down = m-1, left = 0, right = n-1; while(true){ for(int j = left; j<=right;j++) res.push_back(matrix[up][j]); if(++up > down) break; for(int j = up; j<=down; j++) res.push_back(matrix[j][right]); if(--right < left) break; for(int j = right; j>= left; j--) res.push_back(matrix[down][j]); if(--down < up) break; for(int j = down; j >= up; j--) res.push_back(matrix[j][left]); if(++left>right) break; } return res; } };
注意下需要设置一个val变量,它的取值是不断递增的。
class Solution { public: vector<vector<int>> generateMatrix(int n) { int left = 0, right = n-1, top = 0, down = n-1, val = 1; vector<vector<int>> res(n, vector<int> (n,0)); //初始化res为n个vector<int>的对象,每个又包含n个0 while(true){ for(int j = left; j<=right; j++) res[top][j] = val++; if(++top > down) break; for(int j = top; j<=down; j++) res[j][right] = val++; if(--right < left) break; for(int j = right; j>=left; j--) res[down][j] = val++; if(--down < top) break; for(int j = down; j>=top; j--) res[j][left] = val++; if(++left > right) break; } return res; } };