目录
一、题型1:不使用中间量交换两个值
//第一种方法,数学运算
/*
若a=1,b=2;
a = a + b; =3
b = a - b; =1
a = a - b; =2
*/
//第二种方法,位异或运算
/*
若a=1=01b, b=2=10b;
a = a^b;=01^10=11
b = a^b; =11^10=01
a = a^b; =11^01=10
*/
二、剑指offer47.求1+2+...n
1.题目描述:
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
2.解题分析
解题思路:
1.需利用逻辑与的短路特性实现递归终止。
2
.当n==
0
时,(n>
0
)&&((sum+=Sum_Solution(n-
1
))>
0
)只执行前面的判断,为
false
,然后直接返回
0;
3.当n>
0
时,执行sum+=Sum_Solution(n-
1),实现递归计算Sum_Solution(n)。
public class Solution {
public int Sum_Solution(int n) {
int sum = n;
boolean ans = (n>0)&&((sum+=Sum_Solution(n-1))>0);
return sum;
}
}
三、剑指offer48.不使用加减乘除做加法
1.题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
2.分析
/**
* @param num1
* @param num2
* @return
* 分三步计算
* 1.计算不带进位的加法:0+0=0,0+1=1,1+1=0,1+0=1,即运算中的:亦或
* 2.计算进位:0+0=0,0+1=0,1+0=0,1+1=1,只有1+1才会产生进位,即运算中的:与(再向左位移一位)
* 3.二者相加,相加继续使用步骤1的亦或,知道不会产生进位
* */
public class Sword48_add_use_bit {
public int Add(int num1,int num2) {
int sum=num1;
int carry=num2;
while (carry!=0){
int tamp = sum;
sum = sum ^ carry;
carry = (tamp & carry)<<1;
}
System.out.println(sum);
return sum;
}
public static void main(String[] args) {
Sword48_add_use_bit s48 = new Sword48_add_use_bit();
s48.Add(4,7);
}
}