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