热题HOT 100 中等题1-3

2.两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        if(l1==null) return l2;
        if(l2 == null) return l1;
        ListNode dummy = new ListNode(0);  //用来记录末尾
        ListNode current = dummy;   //记录当前参与运算的位
        int carry = 0;    //进位

        while(l1 != null && l2 != null){
            int dig = l1.val+l2.val+carry;   //第一个数+第二个数+进位
            int val =dig %10;     //此位数值
            carry = dig /10;      //新的进位
            ListNode newnode = new ListNode(val);  //newnode.val = val
            current.next = newnode;     //新的链接
            current = current.next;     //后移
            l1 = l1.next;   //第一个数移进下一位
            l2 = l2.next;   //第二个数移进下一位
        }

         while(l1 != null){   //l2空
            int dig = l1.val+carry;
            int val =dig %10;
            carry = dig /10;
            ListNode newnode = new ListNode(val);
            current.next = newnode;
            current = current.next;
            l1 = l1.next;
        }

        while(l2 != null){     //l1空
            int dig = l2.val+carry;
            int val =dig %10;
            carry = dig /10;
            ListNode newnode = new ListNode(val);
            current.next = newnode;
            current = current.next;
            l2 = l2.next;
        }
          //若进位不为零,创建新的进位节点,并且指针指向
        if(carry != 0) current.next = new ListNode(carry); 
        return dummy.next;
    }
}

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

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:

输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:

输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

class Solution {
   public int lengthOfLongestSubstring(String s) {
    int maxLength = 0;
    char[] chars = s.toCharArray();
    int leftIndex = 0;
    //一直维护一个最短字串
    for (int j = 0; j < chars.length; j++) {  //j是前指针
      for (int innerIndex = leftIndex; innerIndex < j; innerIndex++) {
        if (chars[innerIndex] == chars[j]) {
          maxLength = Math.max(maxLength, j - leftIndex);  //更新maxLength
          leftIndex = innerIndex + 1;  //后指针前移
          break;
        }
      }
    }
    return Math.max(chars.length - leftIndex, maxLength);
  }
}

5.最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"
class Solution {
    public String longestPalindrome(String s) {
        if (s == null || s.length() == 0) {
            return "";
        }
        //保存起始位置,测试了用数组似乎能比全局变量稍快一点
        int[] range = new int[2];
        char[] str = s.toCharArray();
        for (int i = 0; i < s.length(); i++) {
        //把回文看成中间的部分全是同一字符,左右部分相对称
        //找到下一个与当前字符不同的字符
            i = findLongest(str, i, range);
        }
        return s.substring(range[0], range[1] + 1);
    }
    
    public static int findLongest(char[] str, int low, int[] range) {
        //查找中间部分
        int high = low;
        while (high < str.length - 1 && str[high + 1] == str[low]) {
            high++;
        }
        //定位中间部分的最后一个字符
        int ans = high;
        //从中间向左右扩散
        while (low > 0 && high < str.length - 1 && str[low - 1] == str[high + 1]) {
            low--;
            high++;
        }
        //记录最大长度
        if (high - low > range[1] - range[0]) {
            range[0] = low;
            range[1] = high;
        }
        return ans;
    }
}

你可能感兴趣的:(热题HOT,100,leetcode,java,数据结构)