leetcode 191:统计1的个数;172. Factorial Trailing Zeroes;54,59 蛇形矩阵 I II


 

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;
    }
};

 

posted @ 2019-03-28 22:49  爱学英语的程序媛  阅读(225)  评论(0编辑  收藏  举报