leetcode刷题笔记

1. 两数之和

题解很棒,最好能说明一下为什么不怕重复造成hash冲突(重复值只能存入一个)。 在这里记录一下: 

1.每次写入时,判断条件为 key和 tag 之间的差值存不存在。

2.题目命题说明了一点,假定只有一个解。也就是说重复元素再多都无所谓。 case 1:如果有3个或者以上的重复元素,代表这个重复元素不可能是解,所以写入map的时候直接覆盖也无所谓; case2:如果只有两个重复元素,同样的道理,假如这个重复元素是解,那么必定是两个重复元素的和等于tag。这种情况下,当遇到第二个重复元素时,不会写入map,这个时候直接已经取到解了。 所以这种方式,不用考虑hash冲突的问题。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map 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

leetcode刷题笔记_第1张图片

面试题03. 数组中重复的数字

知识点:创建hashmap        Map 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 map=new HashMap<>();
        for(int i=0;i

面试题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);

 

你可能感兴趣的:(数据结构与算法)