zoukankan      html  css  js  c++  java
  • LeetCode

    链接

    371. Sum of Two Integers

    题意

    计算两个整数的和,但是不能使用+和-运算符。

    思路

    不能用加减运算符的话,则需要利用位运算。两个数a和b相加,那么会产生尾数,还有可能进位。在位运算中,0+0=1,0+1=1,1+0=1,1+1=10,可以发现前三个式子和第四个式子的尾数(0)和异或的规律是一样的。
    可知:

    尾数=a^b

    那么产生的进位该怎么算呢,显然只有两个数都为1才能进位,所以这和按位与的规律一致。
    可得:
    进位值=(a&b) * 2(进位数要乘以进制才能相加,也就是乘以2)

    那么可得:
    a+b=a^b+(a&b)*2

    这个表达式中还是有加号,但可以发现,进位项不断乘以2,其末尾就不断增加一个0,当0的个数足够多时(假设第n次),an&bn=0,则进位项被消除。因此,只要重复对该式迭代进行运算,进位项最终会变为0,加号也得以消除。

    代码

    Java:

    public class Solution {
        public int getSum(int a, int b) {
            while(a != 0)
            {
                int x = a ^ b;
                a = (a & b) << 1;
                b = x;
            }
        return b;
        }
    }
    

    效率

    Your runtime beats 8.43% of java submissions.

  • 相关阅读:
    leetcode1161
    leetcode1160
    校招真题练习034 倒水(贝壳)
    校招真题练习033 音乐列表(贝壳)
    校招真题练习032 连续相同字符串(头条)
    校招真题练习031 三支球队比分(头条)
    leetcode1144
    ArrayQueue(队列)
    LinkQueue(链队)
    快速幂
  • 原文地址:https://www.cnblogs.com/zyoung/p/6682612.html
Copyright © 2011-2022 走看看