编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
示例 1:
输入:n = 19 输出:true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1
示例 2:
输入:n = 2 输出:false
提示:
1 <= n <= 231 - 1
- class Solution {
- public boolean isHappy(int n) {
- Set
set = new HashSet<>(); - set.add(n);
- int sum = n;
- while(sum != 1) {
- sum = method(sum);
- if(set.contains(sum)) {
- return false;
- }
- set.add(sum);
- }
- return true;
- }
-
- public int method(int n) {
- int sum = 0;
- while(n != 0) {
- sum += (n%10)*(n%10);
- n /= 10;
- }
- return sum;
- }
- }
题目很细节,一开始都会思考怎么才能结束这个循环呢?但是题目说了!不是快乐数会无限循环,循环起来了,那么我们就只需要判断得到的数字 之前是否得到过。去重我们用Set数据结构。了解到这步就很简单啦!
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
- class Solution {
- public int[] twoSum(int[] nums, int target) {
- int[] res = new int[2];
- if(nums == null || nums.length == 0) return null;
- HashMap
map = new HashMap<>(); - for(int i = 0;i
- int tmp = target - nums[i];
- if(map.containsKey(tmp)) {
- res[0] = i;
- res[1] = map.get(tmp);
- return res;
- }
- map.put(nums[i],i);
- }
- return null;
- }
- }
思考:
由于本题最重要的就是查找一个元素是否出现过,且要有下标和值两个元素,我们考虑用map。
本题学到的知识有,数组的判空:不光是nums == null,还要判断nums.length == 0
HashMap的操作:map.put() map.containsKey() map.get()