1. 程式人生 > >LeetCode位運算合集

LeetCode位運算合集

位運算相關知識點

  1. & 與
    兩位都為1,否則為0
  2. | 或
    一位為1,就為1,否則為0
  3. ^ 異或
    相同為0,不同為1
  4. ~ 非
    1 為 0, 0 為 1

344. Reverse String

Write a function that takes a string as input and returns the string reversed.

Example:
Given s = “hello”, return “olleh”.

最簡單的做法

new StringBuilder(s).reverse().toString();

更高效的做法

public
String reverseString(String s) { char[] array = s.toCharArray(); for(int i = 0, j = array.length - 1; i < j; i++, j--){ char tmp = (char) (array[i] ^ array[j]); array[j] = (char) (tmp ^ array[j]); array[i] = (char) (tmp ^ array[i]); } return new String(array
); }

例如:
0010 ^ 0101 = 0111;
0010 ^ 0111 = 0101;
0101 ^ 0111 = 0010;
這樣就完成了兩個數的調換,使用位運算更加高效

190. Reverse Bits

題目:給定一個32位int型數,反轉其二進位制數
例如:
12的二進位制為:0000 0000 0000 0000 0000 0000 0000 1100
反轉二進位制位:1100 0000 0000 0000 0000 0000 0000 0000 (805306368)

思路:首先定義一個result為0,一步步得取出12中二進位制的最後一位,與result相加,並將result左移一位

程式碼:

public int reverseBits(int n) {
    if (n == 0){
        return
n; } int result = 0; for(int i = 0; i < 32; i++){ result <<= 1; result += n & 1; n >>= 1; } return result; }

136. Single Number

Given an array of integers, every element appears twice except for one. Find that single one.
給定整數陣列,除了一個元素之外,每個元素都會出現兩次。 找到那個單一的。

解析:
N1 ^ N1 ^ N2 ^ N2 ^ N3 = N3

public class Solution {
    public int singleNumber(int[] nums) {
        int res = 0;
        for (int i : nums) {
            res ^= i;
        }
        return res;
    }
}