Monthly Archives: December 2016

LeetCode Number of 1 Bits

LeetCode Number of 1 Bits
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).
For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011, so the function should return 3.


要求一个无符号整数的二进制表示中'1'的个数。
没必要先把数的二进制表示求出来,只需要将数n和1相与,如果结果为1,说明最低位为1,否则最低位为0,然后不断把n向右移动,直到n为0。
完整代码如下:

class Solution {
public:
	int hammingWeight(uint32_t n) {
		int cnt = 0;
		while (n) {
			cnt += n & 1;
			n >>= 1;
		}
		return cnt;
	}
};

本代码提交AC,用时3MS。
二刷。直接n&(n-1)可以去掉n中的最后一个数,所以n有多少个二进制1就运算多少次,性能更佳,代码如下:

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int ans = 0;
        while(n != 0) {
            ++ans;
            n = n & (n - 1);
        }
        return ans;
    }
}

本代码提交AC,用时2MS。

LeetCode Ransom Note

LeetCode Ransom Note
Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false.
Each letter in the magazine string can only be used once in your ransom note.
Note:
You may assume that both strings contain only lowercase letters.

canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true

问能否从magazine字符串中抽取一些字母组成新的ransomNote字符串。简单题,直接hash解决,使用的是unordered_map,完整代码如下:

class Solution {
public:
	bool canConstruct(string ransomNote, string magazine) {
		unordered_map<char, int> hash;
		for (int i = 0; i < magazine.size(); i++) {
			hash[magazine[i]]++;
		}
		for (int i = 0; i < ransomNote.size(); i++) {
			hash[ransomNote[i]]--;
			if (hash[ransomNote[i]] < 0)return false;
		}
		return true;
	}
};

本代码提交AC,用时76MS。