leetCode第一天

/**
* 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
* 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
* */

  public int[] towSum(int[] nums, int target) {
       Map<Integer, Integer> map = new HashMap<>();
       // <数组中的值,在数组中的索引>,利用了HashMap在 O(1) 时间内查找元素的特性
       for (int i = 0; i < nums.length; i++) {
           if (map.containsKey(target - nums[i])) {
               return new int[]{i, map.get(target - nums[i])};
           } else {
               map.put(nums[i], i);
           }
       }

       throw new IllegalArgumentException("不存在这样的两个数");
   }
    /**
    * 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。
    * 将两数相加返回一个新的链表。

    * 你可以假设除了数字 0 之外,这两个数字都不会以零开头。

    * 示例:

    * 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    * 输出:7 -> 0 -> 8
    * 原因:342 + 465 = 807
    */

    public ListNode addTowNums(ListNode l1, ListNode l2) {
        ListNode rs = new ListNode(0); // 保持住链表中第一个元素的引用
        // 其实这里可以直接使用l1 l2,但是编程中不应该改变参数,所以将它们赋值给p q
        ListNode p = l1, q = l2, cur = rs.next; // cur用来创建链表
        int carry = 0; // 进位
        while (p != null || q != null) {
            int x = p == null ? 0 : p.val;
            int y = q == null ? 0 : q.val;
            int sum = x + y + carry;
            carry = sum / 10;
            cur = new ListNode(sum % 10);
            cur = cur.next;
            p = p == null ? null : p.next;
            q = q == null ? null : q.next;
        }
        // 注意还要考虑最后的进位
        if (carry > 0) {
            cur = new ListNode(carry);
        }

        return rs.next;
    }
    /**
     * 给定一个字符串,找出不含有重复字符的最长子串的长度。
     *
     * 示例:
     *
     * 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
     *
     * 给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
     *
     * 给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列  而不是子串。
     */

    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        Set<Character> set = new HashSet<>();
        // ans 最长子串的长度
        // j 在没找到重复字符时,指向下一字符的索引;
        // 找到重复字符时,保持不变,直到移动i后使[i, j)内没有j所指向的字符
        int ans = 0, i = 0, j = 0;
        while (i < n && j < n) {
            if (!set.contains(s.charAt(j))){
                set.add(s.charAt(j++));
                ans = Math.max(ans, j - i);
            }
            else {
                set.remove(s.charAt(i++));
            }
        }
        return ans;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值