求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
数据范围: 
进阶: 空间复杂度
,时间复杂度 )
进阶: 空间复杂度
public static int Sum_Solution(int n) { int sum = n; boolean flag = (sum > 0) && ((sum += Sum_Solution(--n)) > 0); return sum; }
public static int Sum_Solution1(int n) { return (int) (Math.pow(n, 2) + n) >> 1; }
public static int Sum_Solution2(int n) {
int res = 0;
int a = n;//若a=2=10
int b = n + 1;//b=3=11
while (a != 0) {
if ((a & 1) == 1)//a在第二位==1的时候才更新res=0+110=6
res += b;
a >>= 1;//a右移1位 1
b <<= 1;//b左移动1位 110
}
return res>>=1;//n(n+1)/2 }
public int Sum(int n) { int res = multi(n, n + 1);//n*(n-1) return res>>=1;//n*(n-1)/2 } private int multi(int a, int b) { int res = 0; //循环体内部, if ((a & 1) == 1), res += b; boolean flag1 = ((a & 1) == 1) && (res += b) > 0; a >>= 1; b <<= 1; // while (a != 0) {}循环条件 boolean flag2 = (a != 0) && (res += multi(a,b)) > 0 ; return res; }
temp[] test = new temp[n]
public class Solution { public int Sum_Solution(int n) { int result = 0; int a = 1; boolean value = ((n!=0) && a == (result = Sum_Solution(n-1))); result += n; return result; } }
# -*- coding:utf-8 -*- class Solution: def Sum_Solution(self, n): return n and (n + self.Sum_Solution(n - 1))
1. import java.util.*; public class Solution { public int Sum_Solution(int n) { int sum = n; boolean ans = (n>0)&&((sum+=Sum_Solution(n-1))>0); return sum; } } 2. import java.util.*; public class Solution { public int Sum_Solution(int n) { n = (int)(Math.pow(n,2)+n)>>1; return n; } }
解题的关键是使用递归,利用递归代替了循环,并且使用逻辑与运算判断n何时为0 class Solution: def __init__(self): self.sum = 0 def Sum_Solution(self, n): # write code here def recur(n): self.sum += n n -= 1 return (n>0) and self.Sum_Solution(n) recur(n) return self.sum 函数recur()实现了循环,从n一直递减加到了1,逻辑与and操作实现了当n=0时,不再计算Sum_Solution(n), 返回self.sum
先取对数再指数算回去。就不用傻傻的递归。
class Solution {
public:
int Sum_Solution(int n) {
//return n*(n+1)/2;
return multi(n, n + 1) >> 1;
}
int multi(int a, int b){
// we can guarantee that both a and b is positive integers
int res = int(pow(10, log10(a) + log10(b))+0.5);
return res;
}
};
解题思路: 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 int Sum_Solution(int n) { int sum = n; boolean ans = (n>0)&&((sum+=Sum_Solution(n-1))>0); return sum; }
public class Solution { public int Sum_Solution(int n) { n = n == 1 ? 1 : n + Sum_Solution(n-1); return n; } }
public class Solution { public int Sum_Solution(int n) { //数学对数原理: // log(a)+log(b) = log(a*b) //log(a)-logb = log(a/b) //所以log(ret)= log((1+n)*n/2) //通过等号两边同时去掉对数取得ret,并消除误差即可 //假设log(a,N)表示底数为a,真数为N的对数,则a^log(a,N) = N //所以ret = 10^log(10,N) = 10^log10(N) = N double a = Math.log10(1+n) + Math.log10(n); double b = Math.log10(2); int ret = (int)(Math.pow(10,a-b)+0.5);//可通过四舍五入消除误差 return ret; } }
静态变量C++
class Temp { public: static int sum; static int s; Temp() { ++s; sum += s; } }; int Temp::sum = 0; int Temp::s = 0; class Solution { public: int Sum_Solution(int n) { vector<Temp> tmp(n); int res = Temp::sum; Temp::sum = 0; Temp::s = 0; return res; } };
class Solution { public: int Sum_Solution(int n) { bool res[n][n+1]; return sizeof(res) >> 1; } };
/* 用递归。 声明sum与n分开,避免混乱。 用boolean类型的中间变量,使用&&的短路规则,进行递归结束。 */ public int Sum_Solution(int n) { //声明sum与n分开,避免混乱 int sum = n; //用boolean类型的中间变量,使用&&的短路规则,进行递归结束 boolean flag = (n > 0) && ((sum += Sum_Solution(n-1)) > 1); return sum; }
# -*- coding:utf-8 -*- class Solution: def __init__(self): self.choice = ['Solution().StopCur(n-1)', 'Solution().Sum_Solution(n-1)'] def Sum_Solution(self, n): # write code here return n + eval(self.choice[not not n]) def StopCur(self, n): return 0
class Solution { public: int Sum_Solution(int n) { int m=multi_32(n,n+1,0)>>1; return m; } int multi_2(int a,int b,int start){ //const int MASK=0x00000003<<start; const int MASK_1BIT=0x00000001<<start; int sum=0; const int a1=a & (MASK_1BIT<<1); const int a2=a & MASK_1BIT; const int b1=b & (MASK_1BIT<<1); const int b2=b & MASK_1BIT; sum=(a1&b1)<<(start+1) ; sum+=(a2&b2)<<start; sum+= ( ( a2&(b1>>1) )+( (a1>>1)&b2) )<< (start+1); return sum; } int multi_4(int a,int b,int shift){ // const int MASK=0x0000000f<<shift; const int MASK_2BIT=0x00000003<<shift; const int a1=a&(MASK_2BIT<<2); const int a2=a&MASK_2BIT; const int b1=b&(MASK_2BIT<<2); const int b2=b&MASK_2BIT; int sum; sum=multi_2(a1, b1, shift+2); sum+=multi_2(a2, b2, shift); sum+=multi_2(a1>>2, b2, shift)<<2; sum+=multi_2(a2, b1>>2, shift)<<2; return sum; } int multi_8(int a,int b,int shift){ const int MASK_4BIT=0x0000000f<<shift; const int a1=a&(MASK_4BIT<<4); const int a2=a&MASK_4BIT; const int b1=b&(MASK_4BIT<<4); const int b2=b&MASK_4BIT; int sum; sum=multi_4(a1, b1, shift+4); sum+=multi_4(a2, b2, shift); sum+=multi_4(a1>>4, b2, shift)<<4; sum+=multi_4(a2, b1>>4, shift)<<4; return sum; } int multi_16(int a,int b,int shift){ const int MASK_8BIT=0x000000ff<<shift; const int a1=a&(MASK_8BIT<<8); const int a2=a&MASK_8BIT; const int b1=b&(MASK_8BIT<<8); const int b2=b&MASK_8BIT; int sum; sum=multi_8(a1, b1, shift+8); sum+=multi_8(a2, b2, shift); sum+=multi_8(a1>>8, b2, shift)<<8; sum+=multi_8(a2, b1>>8, shift)<<8; return sum; } int multi_32(int a,int b,const int shift){ const int MASK_16BIT=0x000000ff<<shift; const int a1=a&(MASK_16BIT<<16); const int a2=a&MASK_16BIT; const int b1=b&(MASK_16BIT<<16); const int b2=b&MASK_16BIT; int sum; sum=multi_16(a1, b1, shift+16); sum+=multi_16(a2, b2, shift); sum+=multi_16(a1>>16, b2, shift)<<16; sum+=multi_16(a2, b1>>16, shift)<<16; return sum; } };