TRANCE
1 力扣题2:两数相加
1.1 题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
1.2 解题思路
题目类型为大模拟,注意边界信息
1.2.1 大模拟
逆序是指链表的值按照逆序的方式来存储,直接两个链表对应节点值相加,记录进位,注意特殊情况,比如链表长短不一,还有可能存在值相加多出一个节点
1.3 代码实现
1.3.1 大模拟实现
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode l3 = new ListNode();
int jinwei = 0;
ListNode preNode = null;
while (l1!=null || l2!=null || jinwei==1) {
if (l1!=null && l2!=null) {
ListNode tempNode = new ListNode();
int temp = (l1.val+l2.val+jinwei)%10;
tempNode.val = temp;
if (preNode!=null)
preNode.next = tempNode;
else
l3 = tempNode;
preNode = tempNode;
if (l1.val+l2.val+jinwei>=10)
jinwei = 1;
else
jinwei = 0;
}
else if(l1==null && l2!=null) {
ListNode tempNode = new ListNode();
int temp = (l2.val+jinwei)%10;
tempNode.val = temp;
if (preNode!=null)
preNode.next = tempNode;
else
l3 = tempNode;
preNode = tempNode;
if (l2.val+jinwei>=10)
jinwei = 1;
else
jinwei = 0;
} else if(l2==null && l1!=null){
ListNode tempNode = new ListNode();
int temp = (l1.val+jinwei)%10;
tempNode.val = temp;
if (preNode!=null)
preNode.next = tempNode;
else
l3 = tempNode;
preNode = tempNode;
if (l1.val+jinwei>=10)
jinwei = 1;
else
jinwei = 0;
} else if(jinwei==1) {
ListNode tempNode = new ListNode();
int temp = jinwei;
tempNode.val = temp;
if (preNode!=null)
preNode.next = tempNode;
else
l3 = tempNode;
jinwei = 0;
}
if (l1!=null)
l1 = l1.next;
if (l2!=null)
l2 = l2.next;
}
return l3;
}
}
2 力扣题3:无重复字符的最长子串
2.1 题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
2.2 解题思路
2.2.1 暴力遍历
类似于字串匹配,二重循环,遍历每一个元素,对每个元素进行最长字串的寻找
2.2.2 滑动窗口
最长字串寻找中存在一个规律,前一个位置找到的最长字串的位置,当前位置可直接从前一个阻挡的最长字串的位置开始判断,因为之前的已经判断过了
2.3 代码实现
2.3.1 暴力遍历
public int lengthOfLongestSubstring(String s) {
Set<Character> treeSet = new TreeSet<>();
int result = 0;
for (int i=0; i<s.length();i++) {
int tempLen = 0;
treeSet = new TreeSet<>();
for (int j=i;j<s.length();j++) {
if (treeSet.contains(s.charAt(j)))
break;
else{
tempLen += 1;
treeSet.add(s.charAt(j));
}
}
if (tempLen>result)
result = tempLen;
}
return result;
}
2.3.2 滑动窗口
public int lengthOfLongestSubstring(String s) {
Set<Character> treeSet = new TreeSet<>();
int result = 0;
int pivot = 0;
int temp_result = 0;
for (int i=0; i<s.length();i++) {
if (i!=0) {
treeSet.remove(s.charAt(i-1));
temp_result-=1;
}
while(pivot<s.length()&&!treeSet.contains(s.charAt(pivot))) {
treeSet.add(s.charAt(pivot));
pivot+=1;
temp_result+=1;
}
result = temp_result>result?temp_result:result;
}
return result;
}