首页 > 其他分享 >LeetCode四则

LeetCode四则

时间:2024-04-12 21:35:13浏览次数:16  
标签:ListNode val int 四则 next grid curr LeetCode

1.给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
    static int[] twoSum(int[] nums, int target) {
        int[] result = 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) {
                    result[0] = i;
                    result[1] = j;
                    return result;
                }
            }
        }
        return result;
    }
/**
 * @author: XiSoil
 *执行分布用时55ms,击败的14.72%Java用户
 *消耗内存分布43.64MB,击败的88.06%Java用户
 **/
Solution
    public int[] twoSum(int[] nums, int target) {
        // 创建一个 Map 用于存储数值与其对应的下标
        Map<Integer, Integer> valueToIndex = new HashMap<>();

        // 使用双指针法,在数组两端同时进行遍历
        for (int i = 0, j = nums.length - 1; i <= j; i++, j--) {
            // 如果 i 和 j 不相同,且两数之和等于目标值
            if (i != j && nums[i] + nums[j] == target) {
                // 返回 i 和 j 的值作为结果
                return new int[]{i, j};
            }

            // 计算目标值与当前值的差值
            int x = target - nums[i];
            // 如果 Map 中包含差值,则返回当前下标和 Map 中存储的下标
            if (valueToIndex.containsKey(x)) {
                return new int[]{i, valueToIndex.get(x)};
            }

            // 如果 i 和 j 相等,即只剩一个数时
            if (i == j) {
                return null;
                // 返回空,表示无法找到满足条件的数对
            }
            // 计算目标值与当前值的差值
            x = target - nums[j];
            // 如果 Map 中包含差值,则返回当前下标和 Map 中存储的下标
            if (valueToIndex.containsKey(x)) {
                return new int[]{j, valueToIndex.get(x)};
            }

            // 将当前值及其下标存入 Map 中
            valueToIndex.put(nums[i], i);
            valueToIndex.put(nums[j], j);
        }

        return null;
        // 所有情况都不符合要求,返回空
    }
最速优解
2.给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
    public static class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0);
        ListNode curr = dummy;
        while (l1 != null || l2 != null) {
            curr.next = new ListNode(0);
            if (l1 != null) {
                if ((curr.val += l1.val) >= 10) {
                    curr.val -= 10;
                    curr.next.val = curr.next.val + 1;
                }
                l1 = l1.next;
            }
            if (l2 != null) {
                if ((curr.val += l2.val) >= 10) {
                    curr.val -= 10;
                    curr.next.val = curr.next.val + 1;
                }
                l2 = l2.next;
            }
            curr = curr.next;
        }
        if (curr.val == 0) {
            ListNode node = dummy;
            while (node.next.next != null) {
                node = node.next;
            }
            node.next = null;
        }
        return dummy;
    }
/**
 * @author XiSoil
 * @date 2024/04/12
 *执行分布用时1ms,击败的100.00%Java用户
 *消耗内存分布43.57MB,击败的11.97%Java用户
 **/
Solution
3.给定一个字符串 s ,请你找出其中不含有重复字符的 最长
子串
的长度。

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

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

示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
public static int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }
        int maxLen = 0;
        int max = 0;
        char[] chars = s.toCharArray();
        int start = 0;
        int end = chars.length - 1;
        ArrayList<Character> list = new ArrayList<>();
        while (start <= end) {

            for (int i = start; i <= end; i++) {
                if (!list.contains(chars[i])) {
                    list.add(chars[i]);
                    maxLen++;
                    max = Math.max(max, maxLen);
                } else {
                    maxLen = 0;
                    list.clear();
                    break;
                }
            }
            start++;
        }
        return max;
    }
/**
 * @author XiSoil
 * @date 2024/04/12 20:35
 *执行分布用时609ms,击败的5.02%Java用户
 *消耗内存分布42.06MB,击败的95.41%Java用户
 **/
Solution
2923.一场比赛中共有 n 支队伍,按从 0 到  n - 1 编号。

给你一个下标从 0 开始、大小为 n * n 的二维布尔矩阵 grid 。对于满足 0 <= i, j <= n - 1 且 i != j 的所有 i, j :如果 grid[i][j] == 1,那么 i 队比 j 队 强 ;否则,j 队比 i 队 强 。

在这场比赛中,如果不存在某支强于 a 队的队伍,则认为 a 队将会是 冠军 。

返回这场比赛中将会成为冠军的队伍。

示例 1:
输入:grid = [[0,1],[0,0]]
输出:0
解释:比赛中有两支队伍。
grid[0][1] == 1 表示 0 队比 1 队强。所以 0 队是冠军。

示例 2:
输入:grid = [[0,0,1],[1,0,1],[0,0,0]]
输出:1
解释:比赛中有三支队伍。
grid[1][0] == 1 表示 1 队比 0 队强。
grid[1][2] == 1 表示 1 队比 2 队强。
所以 1 队是冠军。


tips:
n == grid.length
n == grid[i].length
2 <= n <= 100
grid[i][j] 的值为 0 或 1
对于所有 i, grid[i][i] 等于 0.
对于满足 i != j 的所有 i, j ,grid[i][j] != grid[j][i] 均成立
生成的输入满足:如果 a 队比 b 队强,b 队比 c 队强,那么 a 队比 c 队强
    public int findChampion(int[][] grid) {
        int n = grid.length;
        int m = grid[0].length;
        int left = 0;
        int right = m - 1;
        int champion = -1;
        while (left != right) {
            if (grid[left][right] == 1) {
                champion = left;
                right--;
            }else {
                champion = right;
                left++;
            }
        }
        return champion;
    }
/**
 * @author XiSoil
 * @date  2024/04/12 21:05
 *执行分布用时0ms,击败的100%Java用户
 *消耗内存分布44.46MB,击败的12.41%Java用户
 **/
Solution

 

标签:ListNode,val,int,四则,next,grid,curr,LeetCode
From: https://www.cnblogs.com/xxaxf/p/18132150

相关文章

  • 小学生简单四则运算
    小学生简单四则运算1.开发工具:WebStorm2.技术栈:vue3elementplusvitenpm3.实现功能:随机生成题目答案验证快捷键操作4.展示演示地址:https://easy-math-jc.vercel.app(需要魔法,没有国内域名)5.合作伙伴2252531......
  • 最长递增子序列leetcode的总结
    使用动态规划解决,首先明白dp数组的含义dp[i]表示在位置i时最长的递增子序列dp[i]=max(dp[j]+1,dp[i])为递推公式初始化dp[i]=1都初始化为1因为最基本的每一个位置至少为一个遍历顺序for(inti=2;i<len;i++){            for(intj=0;j<i;j++){if(n......
  • 算法训练营Day08-LeetCode344. 反转字符串 && 541. 反转字符串 II && 151. 反转字符串
    344.反转字符串题目链接:LeetCode344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题思路:字符串首尾字符交换即可完成反转。定......
  • LeetCode 2439. 最小化数组中的最大值
    给你一个下标从 0 开始的数组 nums ,它含有 n 个非负整数。每一步操作中,你需要:选择一个满足 1<=i<n 的整数 i ,且 nums[i]>0 。将 nums[i] 减1。将 nums[i-1] 加1。你可以对数组执行 任意 次上述操作,请你返回可以得到的 nums 数组中 最大值......
  • LeetCode 1760. 袋子里最少数目的球
    给你一个整数数组 nums ,其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。你可以进行如下操作至多 maxOperations 次:选择任意一个袋子,并将袋子里的球分到 2个新的袋子中,每个袋子里都有 正整数 个球。比方说,一个袋子里有 5 个......
  • LeetCode 面试经典150题---005
    ####135.分发糖果n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:每个孩子至少分配到1个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果,计算并返回需要准备的最少糖果数目。n==rat......
  • 软件工作四则运算测试
    沈阳航空航天大学软件工程第二次作业院(系):计算机学院专业:计算机科学与技术班级:-学号:-姓名:-带队教师:-2024年4月7日作业信息 沈阳航空航天大学计算机学院2024软件工程作业课程目标 熟悉一个“高质量”软件的开发过程作业目标 单元测试练习请......
  • 四则运算式生成器
    背景某个小学老师请你为她编写一个能够自动生成四则运算练习题的小程序,要求输入年级和题目数量,程序根据年级输出规定数量的题目,具体要求如下:·一年级运算数为20以内,只生成加法或减法运算式,结果小于20·二年级运算数为50以内,生成加法和减法混合运算式,结果小于50·三年级运算数......
  • 开发四则运算题生成器的经验总结
    引言在数字时代,教育技术的应用已成为提升学习效率的关键。最近,我接受了一个有趣的挑战:为小学生开发一个四则运算练习题生成器。本文将分享我的设计思路、实现过程、遇到的挑战及解决方案,以及我通过这个项目学到的经验。设计与实现四则运算题生成器的目标是根据用户输入的年级和......
  • 刷leetcode有感
    ......