位运算符和逻辑运算符
位运算符我们在编程的过程中也许用得很少,但位运算符的速度极快,使用得当会为程序运行速度带来极大提升。
左移<>运算符可以帮助我们解决乘除2的次方数这是我们都知道的,异或运算符是相同为假不同为真,&&和||称为短路与和短路或,意味着当某一条件可以判断整个式子最终的真假时它不会继续判断下去。请开始他们的表演٩(๑>◡
case1
LeetCode上面有一道题:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。要求不使用额外空间
case2
这是一道听起来很简单但是要求很苛刻的题,我从一个公众号上面看到的:求1到100的累加和,不能使用循环和判断以及乘除,也就是说类似for,if,while,switch还有三元运算符都不能用。
case3
求两个整数之和(int型就够用了),但不能使用±*/
给大家一点思考时间~
------------------------------------------------------------------------------------------------------------------------我是一条分割线
case1解答
留心一下题目我们很容易发现一个点,就是,题目很明确地说,只有一个元素出现了一次,其他都是两次,两次,这个很重要。异或是相同为假不同为真,这也就是说,两个相同的数异或得0,而0和任何数异或都得该数,所以用疑惑来解决该题是最简单不过的了
class Solution {
public int singleNumber(int[] nums) {
int ret = nums[0];
for(int i = 1; i < nums.length; i++)
ret ^= nums[i];
return ret;
}
}
case2解答
不让用循环,那就用递归好了,但是,慢着客官,您递归终止的条件是什么?咱可是不能用判断的关键字的。这时候就是短路运算符出场的时候了
public int addadd(int n){
int sum=n;
boolean t=(n!=0)&&(sum+=addadd(n-1))!=0;
return sum;
}
我们设置的布尔型变量t只是为了让它递归,当n等于0时此条件为真,短路与会忽略后面的函数递归,从而达到终止递归的效果,
case3解答
不用说就是位运算符大显身手的时候了
public int twonumber(int num1,int num2){
int tmp=0;
while(num1!=0){
tmp=num1^num2;
num1=(num1&num2)<<1;
num2=tmp;
}
return num2;
}
这里也用到了异或,我们试验一下异或运算符,可以很容易发现异或运算只是把两个二进制各位相加,只是没有进位,那么要算a+b,各位相加算出来了,进位怎么算呢?a&b<<1其实就是第一位相加产生的进位,在代码中,当num1等于0说明已经没有进位了不需要再向高一位加进位。
标签:Java,num1,递归,nums,int,笔记,运算符,异或
来源: https://blog.csdn.net/weixin_42302727/article/details/98473052