LeetCode热题100道-Day01

13,085 阅读1分钟

1. 两数之和

class Solution {
    public int[] twoSum(int[] nums, int target) {
        for(int i=0;i<nums.length;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]+nums[j]==target){
                    return new int[]{i,j};
                }
            }
        }
        return new int[0];
    }
}

2. 两数相加

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode p1 = l1, p2 = l2;
        ListNode dummy = new ListNode(-1);
        ListNode p = dummy;
        int carry = 0, newVal = 0;
        while (p1 != null || p2 != null || carry > 0) {
            newVal = (p1 == null ? 0: p1.val) + (p2 == null ? 0: p2.val) + carry; 
            carry = newVal / 10;
            newVal %= 10;
            p.next = new ListNode(newVal);
            p1 = p1 == null? null: p1.next;
            p2 = p2 == null? null: p2.next;
            p = p.next;
        }
        return dummy.next;
    }
}

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

class Solution {
    public int lengthOfLongestSubstring(String s) {
         if (s.length() < 2) return s.length();
        int flag=0;//子串起始位置
        int max = 0;
        int len = 0;

        for (int i = 0; i < s.length(); i++) {
            int index = s.indexOf(s.charAt(i),flag);
            if(index < i){//从flag开始 出现了重复字符
                if(max<len){//记录len
                    max = len;
                }
                flag = index+1;//记录子串起始位置
                len = i-flag+1;//重新计算字串长度
            }
            else{
                len++;
            }
        }
        return len>max?len:max;//若最后一个子串没有出现重复字符就需要判断
}
}

4. 寻找两个正序数组的中位数

    class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int n = nums1.length;
        int m = nums2.length;
        int[] array = new int[n+m];
        //讲原来两个数组拷贝到新数组
        System.arraycopy(nums1,0,array,0,n);
        System.arraycopy(nums2,0,array,n,m);
        Arrays.sort(array);
        if((array.length) % 2 != 0){
            int s = (n+m) / 2;
            return array[s];
        }else{
            int a = (n+m) / 2;
            return (array[a] + array[a-1]) *1.0 / 2
        }
    }
}

5. 最长回文子串

class Solution {   
public:
    string longestPalindrome(string s) {
        int sum1 = 0, sum2 = 0;
        string res1, res2;

        for(int i = 0; i < s.length(); i++){ 
            int m = i, n = i;
            while(m - 1 >= 0 && n + 1 < s.length()){
                if(s[m - 1] == s[n +1]) m--, n++;
                else break;
            }
            if(n - m + 1 > sum1){
                sum1 = n - m + 1;
                res1 = s.substr(m, sum1);
            }
        }
          for(int i = 0; i < s.length(); i++){ 
            int m = i + 1, n = i;
            while(m - 1 >= 0 && n + 1 < s.length()){
                if(s[m - 1] == s[n +1]) m--, n++;
                else break;
            }
            if(n - m + 1 > sum2){
                sum2 = n - m + 1;
                res2 = s.substr(m, sum2);
            }
        }
        return sum1 >= sum2 ? res1 : res2;
    }
};