当前位置: 代码迷 >> 综合 >> LeetCode 刷题记录(1,2,3)—Java语言
  详细解决方案

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

热度:94   发布时间:2023-09-18 10:40:57.0

前言

相信对于快要面临面试的小伙伴来说,算法是必考的一关,本人大三狗一只,平时也没有针对算法做过过多的研究和学习。在面试的时候深感吃力,现在定下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;}elsenode.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;}}
}
  相关解决方案