题意整理
- 输入一个整数x(范围在0到999之间)。
- 判断它是否是由某个完全平方数对1000取模所得。
方法一(模拟)
1.解题思路
- 遍历所有可能。
- 如果x是某个平方数对1000取余,直接返回true。
- 如果遍历完,还没有找到对应的平方数,则返回false。
动图展示:
2.代码实现
import java.util.*;
public class Solution {
/**
*
* @param x int整型
* @return bool布尔型
*/
//取余常数
int mod=1000;
public boolean solve (int x) {
//遍历所有可能
for(int i=0;i<1000;i++){
//如果x是某个平方数对mod取余,直接返回true
if(x==(i*i)%mod){
return true;
}
}
return false;
}
} 3.复杂度分析
- 时间复杂度:假设x取值范围的大小为k,则时间复杂度为
。
- 空间复杂度:不需要额外的空间,所以空间复杂度为
。
方法二(打表统计)
1.解题思路
- 将所有可能的x对应的情况,统计在一个记录表里。
- 当输入x时,直接从表里对应的位置取。
2.代码实现
import java.util.*;
public class Solution {
/**
*
* @param x int整型
* @return bool布尔型
*/
//取余常数
int mod=1000;
//记录表
boolean[] f;
public boolean solve (int x) {
//初始化记录表
init();
return f[x];
}
private void init(){
f=new boolean[1000];
//遍历所有可能输入的x
for(int i=0;i<1000;i++){
for(int j=0;j<1000;j++){
//如果满足题目所给的规则
if(i==(j*j)%mod){
f[i]=true;
break;
}
}
}
}
} 3.复杂度分析
- 时间复杂度:假设x取值范围大小为k,初始化记录表的复杂度为
,最终判断的时间复杂度为
。
- 空间复杂度:需要额外大小为k的记录表,所以空间复杂度为
。

京公网安备 11010502036488号