剑指offer第二天

给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]A[i-1]*A[i+1]…*A[n-1]。不能使用除法。

分析B[i]=A[0]A[1]A[i-1]*A[i+1]…*A[n-1]得:
从左到右算 B[i]=A[0]A[1]…*A[i-1]
从右到左算B[i]=A[i+1]…*A[n-1]

 public int[] multiply(int[] A) {
         int len=A.length;
         int [] B=new int [len];
         int temp=1;
             for(int j=0;j<len;temp*=A[j++]){
                 B[j]=temp;
             }
         temp=1;
             for(int k=len-1;k>=0;temp*=A[k--]){
                 B[k]*=temp;
             }
         return B;
    }

写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。

当看到题目的时候,突然意思到没有加减乘除还怎么做运算。仔细想想,计算机每次的计算其实都是利用二进制的异或,移位实现的。那么怎么实现两个数相加呢?

1.第一步不考虑进位,对每一位相加。0加0与 1加1的结果都0,0加1与1加0的结果都是1。我们可以注意到,这和异或的结果是一样的。对异或而言,0和0、1和1异或的结果是0,而0和1、1和0的异或结果是1。
2.接着考虑第二步进位,对0加0、0加1、1加0而言,都不会产生进位,只有1加1时,会向前产生一个进位。此时我们可以想象成是两个数先做位与运算,然后再向左移动一位。只有两个数都是1的时候,位与得到的结果是1,其余都是0。
3. 第三步把前两个步骤的结果相加。
思路是:
第一步,求不进位相加和sum
第二步,求进位carry
第三部,sum和carry*10的和
//注意最后一步还是得递归调用自己,直到进位为0,因为前面两个步骤相加还是只能利用二进制的方法实现

int Add(int num1,int num2) 
{  
        if(num2 == 0)  
                return num1;  

        int sum = num1 ^ num2;  
        int carry = (num1 & num2) << 1;  

        return Addc(sum, carry);  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值