Leetcode题目记录

刷题随笔Java

1.两数之和

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> hash=new HashMap<Integer,Integer>();
        for(int i=0;i<nums.length;i++){
            if(hash.containsKey(target-nums[i])){
                return new int[]{hash.get(target-nums[i]),i};
            }
            hash.put(nums[i], i);
        }
        return new int[0];
        }  
    }

2.两数相加

/**
 * 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 head=null,tail=null;
        int carry=0;
        while(l1 != null || l2 != null){
            int n1=l1!=null ? l1.val:0;
            int n2=l2!=null ? l2.val:0;
            int sum=n1+n2+carry;
            if(head==null){
                head=tail=new ListNode(sum%10);
            }
            else{
                tail.next = new ListNode(sum % 10);
                tail = tail.next;
            }
            carry=sum/10;
            if(l1!=null) 
                l1=l1.next;
            if(l2!=null) 
                l2=l2.next;
        }
        if(carry>0)
            tail.next=new ListNode(carry);
        return head;
    }
}

3.无重复的最长子串

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map<Character,Integer> window=new HashMap<Character,Integer>();
        int left=0;
        int right=0;
        int res=0;
        while(right<s.length()){
            char c=s.charAt(right);
            int count=window.getOrDefault(c, 0) + 1;
            window.put(c, count);
            right++;

            while(window.get(c)>1){
                char d=s.charAt(left);
                int count2=window.getOrDefault(d, 0) - 1;
                window.put(d, count2);
                left++;
            }
            res = Math.max(res, right - left);

        }
        return res;
    }
}

5.最长回文子串

class Solution {
    public String longestPalindrome(String s) {
        int n=s.length();
        String res="";
        for(int i=0;i<n;i++){
            String s1 = pallhan(s, i, i);
            String s2 = pallhan(s, i, i + 1);
            res=res.length()>s1.length() ? res: s1;
            res=res.length()>s2.length() ? res: s2;
        }
        return res;
    }

    //定义子函数
    public String pallhan(String s, int l, int r){
        while(l>=0 && r<s.length() && s.charAt(l)==s.charAt(r)){
            l--;
            r++;
        }
    //Java中:s.substring(l+1, r) 函数返回一个字符串,该字符串是从原字符串的第 l+1 个字符开始,到第 r-1 个字符为止
    //C++中:s.substr(l+1,r-l-1)  函数返回一个字符串,该字符串从原字符串的第 l+1 个字符开始,长度r-l-1
        return s.substring(l+1,r);
        
    }


}

#7.整数反转

class Solution {
    public int reverse(int x) {
        long r = 0;
        while (x != 0) {
            r = r * 10 + x % 10;
            x /= 10;
        }
        if (Math.abs(r) > Integer.MAX_VALUE) return 0;
        return (int) r;
    }
}

#9.回文数

class Solution {
    public boolean isPalindrome(int x) {
        String s=Integer.toString(x);
        int n=s.length();
        int left=0,right=n-1;
        while(left<=right){
            if(s.charAt(left)==s.charAt(right)){
                left++;
                right--;
            }
            else{
                return false;
            }
        }
        return true;    
    }
}

#14.最长公共前缀

class Solution {
    public String longestCommonPrefix(String[] strs) {
        int n=strs.length;
        if(n<=1) return strs[0];
        //遍历一次数组,留下最长公共前缀
        String prefix=strs[0];
        for(int i=1;i<n;i++){
            prefix=maxpre(prefix,strs[i]);
        }
        return prefix;   
    }

//定义子函数,用于判断输入两个字符串的最大公共前缀
    String maxpre(String a, String b){
        String s="";
        int length=Math.min(a.length(),b.length());
        if(length==0) return s;
        for (int i=0;i<length;i++){
            if(a.charAt(i)==b.charAt(i)){
                s+=a.charAt(i);
            }
            else{
                return s;
            }
        }
        return s;
    }
}

在这里插入图片描述
15.三数之和

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int n=nums.length;
        Arrays.sort(nums);
        List<List<Integer>> ans=new ArrayList<>();
        for(int first=0;first<n-2;first++){
            //对首个元素去重
            if(first>0 && nums[first]==nums[first-1])
                continue;
            //对后两个元素进行双指针环节
            int second=first+1;
            int third=n-1;
            int target=-nums[first];
            while(second<third){
                //case1: 正好等于情况
                if(nums[second]+nums[third]==target){
                    ans.add(Arrays.asList(nums[first],nums[second],nums[third]));
                    while(second<third && nums[second]==nums[++second]);
                    while(second<third && nums[third]==nums[--third]);
                }
                //case2: 相加比目标值小,需要增加second
                if(nums[second]+nums[third]<target){
                    while(second<third && nums[second]==nums[++second]);
                }
                //case3: 相加比目标值大,需要减少third
                if(nums[second]+nums[third]>target){
                    while(second<third && nums[third]==nums[--third]);
                }
            }
        }
        return ans;
    }
}

16.最接近的三数之和

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int n=nums.length;
        //作为参考值的迭代
        int res=Integer.MAX_VALUE-target;
        for(int first=0;first<n-2;first++){
            int second=first+1;
            int third=n-1;
            while(second<third){
                int sum=nums[first]+nums[second]+nums[third];
                //Attention:需要res的绝对值接近0,就是sum负数的时候接近0,l++;以及sum正数的时接近0,r--
                //case1:总数正好等于target,绝对值肯定是0;
                if(sum==target) return sum;
                //case2:总数比目标值大的情况,相减肯定是正数;需要r--
                else if(sum>target){
                    if(Math.abs(sum-target)<Math.abs(res-target))
                        res=sum;
                    third--;
                }
                //case2:总数比目标值小的情况,相减肯定是负数;需要l++
                else{
                    if(Math.abs(sum-target)<Math.abs(res-target))
                        res=sum;
                    second++;
                }
            }
        }
        return res;
    }
}

19.删除链表倒数第n个节点

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //链表的名字只是过客;内存还是在这里
        if(head==null)
            return head;
        ListNode dummy=new ListNode(0);
        //dummy:记录下head的头节点,作为标记
        dummy.next=head;
        ListNode cur=dummy;
        int length=0;
        //记录head的长度
        while(head!=null){
            length++;
            head=head.next;
        }
        //cur节点循环操作到点
        for(int i=1;i<=length-n;i++){
            cur=cur.next;
        }
        cur.next=cur.next.next;
        //返回头节点
        ListNode ans=dummy.next;
        return ans;

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LeetCode是一种流行的在线刷题平台,提供了许多算法和数据结构挑战,旨在帮助程序员和计算机科学家提高他们的编程技能。以下是几个LeetCode题目及其答案: 1. 两数之和 题目描述:给定一个整数数组和一个目标值,找出数组中的两个数,它们相加等于目标值。假设每个输入只对应一种答案,并且不能使用相同的元素。 答案:遍历数组,将每个数字存储到一个哈希表中,同时计算出目标值与当前数字的差值。如果差值在哈希表中,则返回这两个数字的索引。时间复杂度为O(n)。 2. 盛最多水的容器 题目描述:给定n个非负整数a1,a2,...,an,其中每个点(i,ai)表示一个坐标。画n条垂直线,使得线i的两个端点在(i,ai)和(i,0)上。找到两条线,它们与x轴一起构成一个容器,使得容器中包含最多水。 答案:使用双指针法,分别指向数组的头部和尾部。每次计算当前容器的大小,然后根据容器两侧的高度差决定是否移动指针。时间复杂度为O(n)。 3. 无重复字符的最长子串 题目描述:给定一个字符串,请找出其中不含有重复字符的最长子串的长度。 答案:使用双指针法,分别指向子串的起始和结束位置。每次判断当前字符是否存在于子串中,如果存在,则移动起始指针到重复字符的下一个位置,否则移动结束指针。同时记录最长子串的长度。时间复杂度为O(n)。 上述题目只是LeetCode中的部分题目,不同的题目需要采用不同的算法和数据结构进行解决。通过刷LeetCode和其他类似的在线刷题平台,可以提高编程能力和算法思维能力,使得程序员更加熟练地处理各种算法问题。 ### 回答2: LeetCode是一个在线的编程题库,提供了各种不同难度和类型的编程题目。这些题目主要涵盖了算法、数据结构、字符串操作、图算法等方面的内容。 每道题目都有一个独特的编号和描述,通过阅读题目可以了解到输入和输出的形式,以及题目的具体要求。解答题目通常需要理解问题的本质,设计相应的算法,编写代码实现,并进行测试验证。 题目的难度分为简单、中等和困难三个级别,根据不同的难度以及自己的编程能力,可以选择相应的题目来挑战。 解答题目的关键在于理解问题的本质,分析解决问题的思路,并设计合适的算法实现。这个过程需要对常见的算法和数据结构有一定的了解,比如动态规划、贪心算法、递归、队列等。 对于每一道题目LeetCode提供了多种语言的代码模板,如C++、Java、Python等,可以根据自己的编程习惯和喜好选择相应的语言进行代码编写。 解答题目的过程中需要注意代码的效率和正确性,特别是对于大规模输入的情况,需要考虑时间和空间复杂度。在完成代码编写后,还需要进行测试验证,确保程序的正确性。 在解答题目过程中,可以参考其他人的解题思路和代码实现,并进行对比和学习。LeetCode还提供了题目的讨论区,可以与其他的编程爱好者交流和分享经验。 总之,通过LeetCode可以提升自己的编程能力,加深对算法和数据结构的理解,并为面试和竞赛积累经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值