一天一道算法题(为更好的明天奋斗)

    科技2025-11-12  11

    往期

     

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

     

    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

     

    示例:

    给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

     

    解析:

    循环数组,将目标值减去数组的每一个值保存到键值对中,并保存当前数组值的下标;与下一个数组值进行比较,若相同则得出结果

    中心思想:本末倒置

     

    代码:

    public static int[] TwoSum(int[] nums, int target) { Dictionary<int, int> dic = new Dictionary<int, int>(); for (int i = 0; i < nums.Length; i++) { var diff = target - nums[i]; if (dic.ContainsKey(nums[i])) { return new int[] { dic[nums[i]], i }; } if(!dic.ContainsKey(diff)) { dic.Add(diff, i); } } throw new ArgumentNullException("没有找到目标值"); }

     

     

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

     

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

     

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

     

    示例:

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

     

    解析:

    得到两个链表的当前节点值,将当前节点值相加,将相加结果取模,就是新链表的当前节点值;因为每一个节点存储的值只能是个位数,所以若当前节点相加的值若大于10则需要向下一个节点递进1,所以每一个节点相加时都要向下一个节点传递进位数。

    中心思想:递归链表所有节点

     

    代码:

    public class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; } } public static ListNode AddTwoNumbers(ListNode l1, ListNode l2,int num = 0) { if(l1 == null && l2 == null) { if (num != 0) return new ListNode(num); else return default; } int midValue = (l1?.val ?? 0) + (l2?.val ?? 0) + num; var ListNode = new ListNode(midValue % 10); ListNode.next = AddTwoNumbers(l1?.next,l2?.next,midValue / 10); return ListNode; }

     

     

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

     

    示例 :

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

     

    解析:

    从题目可得知此题就像是一个滑动块,从第一个字符开始进入块中,当进入块的所有字符碰到重复字符时,则就要从头开始装块;

    如下:

    (abc)abcbb : 滑块从a开始装,装到第4个字符时碰到了重复字符,则成为这种情况(abca)bcbb ,此时已经不符合题目了,所以要剔除掉一个a,剔除的a肯定是要剔除第一个,因为下一个滑块是要从第2个字符开始,所以滑块现在变为a(bca)bcbb,这样则符合题目,再滑动到下一个字符时,又出现了新的重复字符a(bcab)cbb,这样也要剔除第一个b;依次类推下去,滑块滑完了,所以在滑块每依次滑动时,我们记录下滑块的长度,取出最大的长度则是得出的结果。

    中心思想:队列(先进先出)

     

    代码:

    public static int LengthOfLongestSubstring(string s) { int max = 0; Queue<char> q = new Queue<char>(); foreach (char c in s) { while (q.Contains(c)) q.Dequeue(); q.Enqueue(c); if (q.Count > max) max = q.Count; } return max; }

     

     

    Processed: 0.018, SQL: 8