LeetCode-【数学】解答技巧总结

leetcode 7题目链接:LeetCode7_反转整数

int reverse(int x) 
{
	int r=0;
	while(x)
	{
		int t=r;
		r=r*10+x%10;//r从低位加到高位
		if((x<10)&&(t!=(r-x%10)/10))//回退到加当前循环数之前,即t,看是否溢出
		{
			return 0;
		}
		x/=10;
	}
	return r;
}

在网上看到别人的答案,感觉非常精妙。首先,此解答无需判断整数的正负,正负数进行加减乘除取余操作结果都一样,其次,判断是否溢出也非常简单,因为输入是整数,所以溢出只可能出现在最后一位需要反转的数字加上去之后,也就是对原整数最高为进行反转之后,因此判断最后一位加上之前的值t与加上最后一位以后减去刚加上的那一位,如果不相等,则表明出现了整数溢出,输出0。

leetcode67题目链接:LeetCode67_二进制求和

string addBinary(string a, string b) 
{
	string s="";
	int carry=0;
	int len_a=a.length()-1,len_b=b.length()-1;
	while(len_a>=0||len_b>=0||carry==1)
	{
		carry+=((len_a>=0)?a[len_a]-'0':0);
		carry+=((len_b>=0)?b[len_b]-'0':0);
		s=char(carry%2+'0')+s;
		carry/=2;
		len_a--;len_b--;
	}
	return s;
}

看到此解答,第一感觉就是简单,而且很清晰,对解答该题常见的难点都做了完美的解决。1)两个字符串长度不一样,采用了长度 “或” 的逻辑,字符串结束后,默认取0;2)进位问题,也采用了 “或” ,即使两个字符串长度已经结束了,但是carry为1时继续执行;3)目标字符串s每次将新增字符加到最前面,解决了倒序问题。

leetcode题目链接:LeetCode415_字符串相加

string addStrings(string num1, string num2) 
{
	string s="";
	int carry=0;
	int len1=num1.length()-1,len2=num2.length()-1;
	while(len1>=0||len2>=0||carry>0)
	{
		carry+=(len1>=0?num1[len1]-'0':0);
		carry+=(len2>=0?num2[len2]-'0':0);
		s=char(carry%10+'0')+s;
		carry/=10;
		len1--;
		len2--;
	}
	return s;
}

与上面的题目解答类似,只是将二进制改为了十进制,只需要将少许改动即可完成,优点见上面分析。

你可能感兴趣的:(LeetCode)