我对 Leetcode 谜题 Sqrt(x) 的解决方案有什么问题?
What is wrong of my solution for the Leetcode puzzle Sqrt(x)?
我正在做题为 sqrt(x)(https://leetcode.com/problems/sqrtx/) 的 LeetCode 第 69 题。它要求我return 整数的平方根也在另一个整数中。以下是我的解决方案。
public class Solution {
public int mySqrt(int x) {
int i = 0;
if(x==0)
{
return 0;
}
for(i = 1;i<x/2;i++)
{
if(((i*i)<=x)&&((i+1)*(i+1)>x))
{
break;
}
}
return i;
}
}
我提交代码后,所有x >= 2147395600的测试用例都失败了。当 x = 2147395600 时,它是 returning 289398 而不是 46340,这是正确的答案。我的代码有什么问题?
你可以试试我的代码:
public int mySqrt(int x) {
long i = 0;
long j = x;
int mid = 0;
if (x == 0) {
return 0;
}
if (x == 1) {
return 1;
}
while (i <= j) {
mid = (int)(i + j)/2;
if (x/mid == mid) {
return (int)mid;
} else if (x/mid > mid) {
i = mid + 1;
} else if (x/mid < mid) {
j = mid - 1;
}
}
return (int)j;
}
使用 long 而不是 int。这是因为 int 仅上升到 2147395600,而 long 远高于此。但是,代价是您必须先转换为 long,然后再转换回 int。
我遇到了同样的问题,但只需在 ii 表达式前添加一个类型转换(long),我就解决了。问题在于 ii 超出了 int 可以保存的值的限制,因此返回了垃圾值。
PS:此解决方案非常慢,因此请考虑其他解决方案,例如上面提供的二进制搜索。
我正在做题为 sqrt(x)(https://leetcode.com/problems/sqrtx/) 的 LeetCode 第 69 题。它要求我return 整数的平方根也在另一个整数中。以下是我的解决方案。
public class Solution {
public int mySqrt(int x) {
int i = 0;
if(x==0)
{
return 0;
}
for(i = 1;i<x/2;i++)
{
if(((i*i)<=x)&&((i+1)*(i+1)>x))
{
break;
}
}
return i;
}
}
我提交代码后,所有x >= 2147395600的测试用例都失败了。当 x = 2147395600 时,它是 returning 289398 而不是 46340,这是正确的答案。我的代码有什么问题?
你可以试试我的代码:
public int mySqrt(int x) {
long i = 0;
long j = x;
int mid = 0;
if (x == 0) {
return 0;
}
if (x == 1) {
return 1;
}
while (i <= j) {
mid = (int)(i + j)/2;
if (x/mid == mid) {
return (int)mid;
} else if (x/mid > mid) {
i = mid + 1;
} else if (x/mid < mid) {
j = mid - 1;
}
}
return (int)j;
}
使用 long 而不是 int。这是因为 int 仅上升到 2147395600,而 long 远高于此。但是,代价是您必须先转换为 long,然后再转换回 int。
我遇到了同样的问题,但只需在 ii 表达式前添加一个类型转换(long),我就解决了。问题在于 ii 超出了 int 可以保存的值的限制,因此返回了垃圾值。
PS:此解决方案非常慢,因此请考虑其他解决方案,例如上面提供的二进制搜索。