剑指Offer

4.5 位运算(5)

2017-12-27  本文已影响12人  coderjiege

套路


注意点


目录


二进制中1的个数

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

public int NumberOf1(int n) {
    int ans = 0;
    char[] arr = Integer.toBinaryString(n).toCharArray();
    for (char ch : arr) {
        if (ch == '1') ans++;
    }
    return ans;
}
public int NumberOf1(int n) {
    return Integer.toBinaryString(n).replaceAll("0", "").length();
}
public int NumberOf1(int n) {
    int count = 0;
    while (n != 0) {
        n &= n - 1;
        count++;
    }
    return count;
}

求1+2+3+...+n

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

public int Sum_Solution(int n) {
    boolean b = (n > 0) && ((n += Sum_Solution(n - 1)) > 0);
    return n;
}

数组中只出现一次的数字

题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
    // ans 保存两个只出现一次的数异或的结果
    // index 保存ans中不同的那一位从右往左方向的索引位置
    int ans = 0, index = 0;
    for (int i = 0; i < array.length; i++) {
        ans ^= array[i];
    }
    // == 比 & 优先级高!
    while ((ans & 1) == 0) {
        ans >>= 1;
        index++;
    }
    for (int i = 0; i < array.length; i++) {
        // == 比 & 优先级高!
       (array[i] >> index & 1) == 0 ? num1[0] ^= array[i] : num2[0] ^= array[i];
    }
}

不用加减乘除做加法

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

public int Add(int num1,int num2) {
    do {
        int temp = num1 ^ num2;
        num2 = (num1 & num2) << 1;
        num1 = temp;
    } while (num2 != 0);
    return num1;
}

扑克牌顺子

LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0。

public boolean isContinuous(int [] numbers) {
    if (numbers == null || numbers.length != 5) {
        return false;
    }
    int min = 14, max = -1, bitFlag = 0;
    for (int i = 0; i < 5; i++) {
        int num = numbers[i];
        if (num < 0 || num > 13) return false;
        if (num == 0) continue;
        if ((bitFlag >> num & 1) == 1) return false;
        bitFlag |= 1 << num;
        if (num < min) min = num;
        if (num > max) max = num;
        if (max - min >= 5) return false;
    }
    return true;
}

上一篇下一篇

猜你喜欢

热点阅读