202.快乐数
题目描述
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
题解
当该过程为无限循环,返回false;当这个数变为1,返回true;
解题关键是如何判断开始出现无限循环,可以将每次的平方和保存在集合里面,当集合里面出现同样的数时,则表明出现了无限循环,返回false;
class Solution {
public boolean isHappy(int n) {
Set<Integer> set= new HashSet<>(); //使用set集合存储
while(n!=1){
n=sumNum(n);
if(set.contains(n)){ //判断集合中是否包含重复元素
return false;
}else{
set.add(n);
}
}
return true;
}
// 求平方和
public int sumNum(int num){
int sum=0;
while(num!=0){
int temp=num%10;
num/=10;
sum+=temp*temp;
}
System.out.println(sum);
return sum;
}
}
1.两数之和
题目描述
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
题解
题解一:暴力破解
使用两层for循环,时间复杂度:O(n^2)
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res=new int[2];
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
res[0]=i;
res[1]=j;
return res;
}
}
}
return new int[0];
}
}
题解二:哈希
什么时候使用哈希表?
当我们需要查询一个元素是否出现过,是否在一个集合中时,可以使用哈希表。
本题需要返回元素的下标,因此需要使用key-value结构,key存储元素,value存储下标,通过key值来寻找下标。
当我们开始遍历这个数组时,首先用temp=target-nums[i]
其次,在map集合中查找是否包含temp,如果包含说明数组中找到了这两个值,将它保存到res数组中
如果map集合中不包含,则将nums[i]存入数组。
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res=new int[2];
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
int temp=target-nums[i];
if(map.containsKey(temp)){
res[0]=i;
res[1]=map.get(temp);
break;
}
map.put(nums[i],i);
}
return res;
}
}