来自《剑指Offer(第二版)》
题目描述
求 1+2+…+n ,要求不能使用乘除法、for
、while
、if
、else
、switch
、case
等关键字及条件判断语句(A?B:C
)。
示例 1:
示例 2:
限制:
题解
逻辑(短路)与
看完标题,发现这是一道面试题!!!
看到第一行的“要求不能使用……”,我人傻了,没错,就是人傻了~~
想用“递归”,但是乘除法不能用、条件判断也不能用🤣🤣🤣
这要怎么做啊?!
等等,没说不能用运算符哦!!!
试试看呗~~
直接写写源码~~
1 2 3 4 5 6 7 8 9 10
| class Solution { public int sumNums(int n) { boolean x = n > 1 && (n += sumNums(n - 1)) > 0; return n; } }
|
思路吗?就直接看源码就懂了!!!
不懂,那就看多几次!!!
补充
逻辑运算符的短路效应:
常见的逻辑运算符有三种,即 “与 &&
”,“或 ∣∣
”,“非 !
” ;
而其有重要的短路效应,如下所示:
本题需要实现 “当 n = 1n=1 时终止递归” 的需求,可通过短路效应实现。
异常捕获
这个方法会超时,但是确实是可以。
1 2 3 4 5 6 7 8 9 10
| class Solution { int[] test=new int[]{0}; public int sumNums(int n) { try{ return test[n]; }catch(Exception e){ return n+sumNums(n-1); } } }
|
移位运算符
移位运算符确实可以解,但是好像不是很多人用它写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| class Solution { public int sumNums(int n) { int ans = 0, A = n, B = n + 1; boolean flag;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0; A <<= 1; B >>= 1;
return ans >> 1; } }
|
我在题解区看到了“你是我见过最变态的题解”,不信就看👇
原帖是解过最变态的一道题