1到100的平方和 java_力扣:平方数之和——Java、Python

这道题在数学这个汇总里面是标记最简单的,我一开始打算作为热身练习的,结果困难重重。

1、C++:超出int范围!

第一次的代码是这样的!

int ps(int aNum) {

return aNum * aNum;

}

bool judgeSquareSum(int c) {

int i, j;

for (i = 0; i <= c; i++)

for (j = 0; j <= c; j++)

if (ps(i) + ps(j) == c) {return true;}

return false;

}

然后显而易见,报错

21 / 124 个通过测试用例

状态:执行出错

提交时间:0 分钟之前

执行出错信息:

Line 2: Char 17: runtime error: signed integer overflow: 46341 * 46341 cannot be represented in type 'int' (solution.c)

最后执行的输入:

100000

是什么?int超出界限了。

那么改成longlong!

2、longlong超时!

第二次代码如下:

long long ps(long long aNum) {

return aNum * aNum;

}

bool judgeSquareSum(int c) {

int i, j;

for (i = 0; i <= c; i++)

for (j = 0; j <= c; j++)

if (ps(i) + ps(j) == c) {return true;}

return false;

}

一开始自信满满的提交了,结果报错出现了!

25 / 124 个通过测试用例

状态:超出时间限制

提交时间:0 分钟之前

最后执行的输入:

1000000000

好吧,既然longlong超时,那么就把双重循环缩短点

3、for循环缩短再次超时

long long ps(long long aNum) {

return aNum * aNum;

}

bool judgeSquareSum(int c) {

long long i, j;

for (i = 0; i * i <= c; i++)

for (j = 0; j * j <= c; j++)

if (ps(i) + ps(j) == c) {return true;}

return false;

}

这次的for循环缩短了很多,但是还报错!😡

力扣!你要拿我怎么滴??

98 / 124 个通过测试用例

状态:超出时间限制

提交时间:0 分钟之前

最后执行的输入:

2147482647

那么没辙了吗,不,要施展我的绝招了!

我打算在Java上面试试,我对C++没信心了……

这个绝招是——二分查找!

public class Solution {

public boolean judgeSquareSum(int c) {

for (long a = 0; a * a <= c; a++) {

int b = c - (int)(a * a);

if (binary_search(0, b, b))

return true;

}

return false;

}

public boolean binary_search(long s, long e, int n) {

if (s > e)

return false;

long mid = s + (e - s) / 2;

if (mid * mid == n)

return true;

if (mid * mid > n)

return binary_search(s, mid - 1, n);

return binary_search(mid + 1, e, n);

}

};

哎呀通过啦!那么有没有别的方法呢?Python也是我新学的语言呀

来,双指针了解一下——

class Solution:

def judgeSquareSum(self, c: int) -> bool:

i,j=0,int(c**0.5)

while i<=j:

if i*i+j*j==c:

return True

elif i*i+j*j>c:

j-=1

elif i*i+j*j

i+=1

return False

哎呀又通过啦!

高兴😄

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值