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