1. 两数之和
题解很棒,最好能说明一下为什么不怕重复造成hash冲突(重复值只能存入一个)。 在这里记录一下:
1.每次写入时,判断条件为 key和 tag 之间的差值存不存在。
2.题目命题说明了一点,假定只有一个解。也就是说重复元素再多都无所谓。 case 1:如果有3个或者以上的重复元素,代表这个重复元素不可能是解,所以写入map的时候直接覆盖也无所谓; case2:如果只有两个重复元素,同样的道理,假如这个重复元素是解,那么必定是两个重复元素的和等于tag。这种情况下,当遇到第二个重复元素时,不会写入map,这个时候直接已经取到解了。 所以这种方式,不用考虑hash冲突的问题。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i< nums.length; i++) {
if(map.containsKey(target - nums[i])) {
return new int[] {map.get(target-nums[i]),i};
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
}
map.containsKey map.put
throw new IllegalArgumentException
面试题03. 数组中重复的数字
知识点:创建hashmap Map<Integer, Integer> map=new HashMap<>();
put函数 containsKey函数的使用 key key key 我的神!
运用HashMap,将数组中的数一一存入,同时比较是否map中存在,已存在的话就输出,不存在则存入map中并赋给初始值1.
class Solution {
public int findRepeatNumber(int[] nums) {
int n=nums.length;
int result=0;
Map<Integer, Integer> map=new HashMap<>();
for(int i=0;i<n;i++){
if(map.containsKey(nums[i])){
result=nums[i];
}else{
map.put(nums[i],i);
}
}
return result;
}
}
面试题05. 替换空格
知识点:java中字符串数组转换为String字符串
字符串数组长度s.length(),加括号,而数组长度不用加括号
char[] array=new char[length*3];
String newstr=new String(array,0,size);
由于每次替换从 1 个字符变成 3 个字符,使用字符数组可方便地进行替换。建立字符数组地长度为 s 的长度的 3 倍,这样可保证字符数组可以容纳所有替换后的字符。
获得 s 的长度 length
创建字符数组 array,其长度为 length * 3
初始化 size 为 0,size 表示替换后的字符串的长度
从左到右遍历字符串 s
获得 s 的当前字符 c
如果字符 c 是空格,则令 array[size] = '%',array[size + 1] = '2',array[size + 2] = '0',并将 size 的值加 3
如果字符 c 不是空格,则令 array[size] = c,并将 size 的值加 1
遍历结束之后,size 的值等于替换后的字符串的长度,从 array 的前 size 个字符创建新字符串,并返回新字符串
String newstr=new String(array,0,size);