LeetCode 刷题记录(1,2,3)—Java语言

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34379015/article/details/80208780

前言

相信对于快要面临面试的小伙伴来说,算法是必考的一关,本人大三狗一只,平时也没有针对算法做过过多的研究和学习。在面试的时候深感吃力,现在定下Flag,每天在LeetCode上刷几道题,然后在博客上分享思路。欢迎大佬点评,给予更好的结题思路。

1. 两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

思路:

依照题意,可以得知每个输入只定义一个结果,那么只需要从这些数中挑选两个不重复并且相加的值为target的数。即依次比较每个数与其后的数相加后的值是否等于target的值,如果找到即可输出。

代码:

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

2. 两数相加

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

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

示例:

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

思路:

看完题目之后观看这个输入,直接的做法就是把输入的两个值转化为int类型然后将两者相加,在转化为链表。此解法代码省略。第二种就是将两个链表每个结点进行相加然后模10,将高位进位。代码如下:

代码:

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode node = null;
        ListNode res = null;
        int add = 0;
        while(l1!=null||l2!=null){
            if(l1==null){
                if(node == null||add==0){
                    temp(res,node,l2);
                    break;
                }else{
                    int value = l2.val+add;
                    node.next = new ListNode(value%10);
                    node= node.next;
                    add = value/10;
                    l2 = l2.next;
                }
            }else if(l2==null){
                if(node==null||add==0){
                    temp(res,node,l1);
                    break;
                }else{
                    int value = l1.val+add;
                    node.next = new ListNode(value%10);
                    node= node.next;
                    add = value/10;
                    l1 = l1.next;
                }   
            }else{
                int value = l1.val+l2.val+add;
                if(node == null){
                    node = new ListNode(value%10);
                    res = node;
                }else{
                    node.next = new ListNode(value%10);
                    node = node.next;
                }
                add = value / 10;
                l1 = l1.next;
                l2 = l2.next;
            }

        }
        if(add!=0){
            node.next = new ListNode(add);
        }
        return res;
    }

    private void temp(ListNode res,ListNode node,ListNode l){
        if(node == null){
            node = l;
            res = node;
        }else
            node.next = l;
    }
}

代码略长,可以进行简化。

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

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

示例:

给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。

给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。

给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,”pwke” 是 子序列 而不是子串。

思路

首先的明确题目要求,要求是求给定的字符串中不含有重复字符的最长子串长度,不重复则需要一个哈希表来判断。一般的处理就是定义一个map数组然后让每个char对应的map[char]=1;但是这里有个问题,如果发现出现重复,则需要回溯,回溯到这个字符上次出现的地方,再往下进行判断(比如abcabcbb,在第4个字符a进行判断的时候,发现重复,则之需要从第二字符b开始记录重新记录。)那么map就不能简单表示该字符是否出现,而应该表示该字符上一次出现的位置,如没有出现则为-1。通过以上的方式进行重复子串长度的记录,然后定义一个max记录下出现的最大长度。遍历后输出。

代码

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int map[] = new int[256];
        if(s==null||s.length()==0)
            return 0;
        int max = 1;
        int size = 0;
        fill(map,-1);
        for(int i=0;i<s.length();i++){
            int index = s.charAt(i);
            if(map[index]!=-1){
                max = Math.max(max,size);
                i = map[index];
                fill(map,-1);
                size = 0;
            }else{
                size++;
                map[index] = i;
            }

            if(i==s.length()-1){
                max = Math.max(max,size);
            }
        }
        return max;
    }
    private void fill(int[] map,int num){
        for(int i=0;i<map.length;i++){
            map[i] = num;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34379015/article/details/80208780