【leetcode 1 两数之和】
class Solution {
public int[] twoSum(int[] nums, int target) {//方法定义了返回int
for(int i=0; i < nums.length; i++){
for(int j=i+1; j<nums.length; j++ ){
if(nums[i] + nums[j] == target){
return new int[]{i,j};
}
}
}
return new int[0];
}
}
首先我能想到的就是两层for循环遍历了 相加看是不是等于target
但是我不知道怎么输出[i,j] 然后看了题解return new int[]{i,j};也是云里雾里的,return new int[] {i, j}) 中的 int 显示了返回类型,但为什么使用关键字“new”?
去网上查了一下为什么要这样写
twoSum 方法定义了返回int,但是并没有“预先”声明一个数组来返回所需的元素,因此要返回一个数组,它必须在它之前使用“new”来创建一个具有所需内存分配的新数组可以分配并返回.
啊大概是懂了 吧。
哈希映射
先看一遍之前做过的笔记 mp.weixin.qq.com/s/6SLt2NRx7…
再多去看一下网上查找的文章 多看几遍 www.geeksforgeeks.org/java-util-h…
class Solution {
public int[] twoSum(int[] nums, int target) {
// 创建 HashMap
Map<Integer, Integer> map = new HashMap<Integer, Integer>();//
for (int i = 0; i < nums.length; i++) {
// 判断数组nums是否存在target - nums[i]的key值
if (map.containsKey(target - nums[i])) {// containsKey查找键是否存在
// 存在就返回对应target-nums[i]的key值对应的下标和此时i的下标
return new int[] { map.get(target - nums[i]), i };// get 根据键获取值
}
//不存在就把nums[i], i添加到map中
map.put(nums[i], i);// put() 添加
}
throw new IllegalArgumentException("No two sum solution");// 如果最终都没有结果则抛出异常
}
}
快乐数
啊啊啊啊啊啊快乐不起来啊,我记得我之前是看过这个题的,有思路但是写不出来给我劝退了,我就不信了这一次还做不出来
二话不说上哈希表解法哼
就是先给这个数n数位分离,然后求平方相加就得到下一个数,每一次进行这样的计算后就判断是不是在这个集合中,不存在的话则将其加入集合中,在的话就不是快乐数。
为什么要这样说呢!!!为啥曾经出现过就肯定不是快乐数,以前不懂我现在懂了,就拿2举例,就这样一直下去是跳不出来的是无限循环的,重复出现过的就说明它已经存在了,就不是快乐数。
class Solution {
private int getNextNumber(int n) {
int res = 0;
while (n > 0) {
//数位分离
int temp = n % 10;
res += temp * temp;
n = n / 10;
}
return res;
}
public boolean isHappy(int n) {
//构建一个空的HashSet对象
Set<Integer> record = new HashSet<>();
//contains() 方法用于检查 HashSet 中是否存在特定元素
//如果集合中存在某个元素,则用于返回 true。
while (n != 1 && !record.contains(n)) {
//HashSet 类的 add() 方法在内部调用了put()方法
record.add(n);//不存在则将n加入集合中
//调用方法将当前数替换为它每个位置上的数字的平方和。
n = getNextNumber(n);
}
return n==1;//如果n为1,则是快乐数
}
}
加一个题 罗马数转整数
class Solution {
public String intToRoman(int num) {
int[] value = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] reps = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
StringBuffer ans = new StringBuffer();//用来记录组成数字的字母
for (int i = 0; i < value.length; i++) {
//如果该数超过了上面列的数之一
while (num >= value[i]) {
num = num - value[i];
ans.append(reps[i]);//追加value[i]对应的字母reps[i]
}
}
return ans.toString();//把最终的ans的字母组成输出来
}
}