LeetCode热题100道-Day01

93 阅读1分钟

LeetCode热题100道-Day01

1. 两数之和

  • 先创建哈希表把数组拷贝到表中,Key存元素值,Value存元素下标,循环遍历nums,在哈希表中寻找target - nums[i]的Key值,存在并且两数的Value不同,存入数组res并返回。
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        int[] res = new int[2];
        for (int i = 0; i < nums.length; i++) 
            map.put(nums[i], i);   
        for (int i = 0; i < nums.length; i++) {
            int num = target - nums[i];
            if (map.containsKey(num)) {
                if (i != map.get(num)) {
                    res[0] = i;
                    res[1] = map.get(num);
                }
            }
        }
        return res;
    }
}

2. 两数相加

  • 定义一个虚拟的头节点dummp,p指针指向头节点定义一个进位值count,当p1不等于null或p2不等于null时进入循环,将两者节点值相加并加上count赋给sum,下一节点的count为sum / 10,p指针的下一节点值为sum mod 10,将新链表的节点后移,当p1不等于null时,p1的节点后移,p2相同,再进行下一次循环。如果count不为0,则count赋给链表的新节点。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(-1), p = dummy;
        ListNode p1 = l1, p2 = l2;
        int count = 0;

        while (p1 != null || p2 != null) {
            int n1 = p1 != null ? p1.val : 0;
            int n2 = p2 != null ? p2.val : 0;
            int sum = n1 + n2 + count;

            count = sum / 10;
            sum %= 10;
            p.next = new ListNode(sum);
            p = p.next;

            if (p1 != null) p1 = p1.next;

            if (p2 != null) p2 = p2.next;
        }

        if (count != 0) {
            p.next = new ListNode(count);
        }
        return dummy.next;
    }
}

3. 无重复字符的最长子串

  • 定义一个HashMap存储字符和坐标,定义max、start和end指针,让start和end都指向第一个字符。对字符串进行遍历,如果end所指向字符不存在map中,则把字符存入map,更新max,如果存在map中,则改变start为map中与end指向的那个相等字符的下标+1。
class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s.length() <= 1) {
            return s.length();
        }
        int max = 0;
        Map<Character, Integer> map = new HashMap<>();
        for (int start = 0, end = 0; end < s.length(); end++) {
            char ch = s.charAt(end);
            if (map.containsKey(ch)) {
                start = Math.max(map.get(ch) + 1, start);
            }
            max = Math.max(end - start + 1, max);
            map.put(ch, end);
        }
        return max;
    }
}