1. 兩數之和
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/two-sum
暴力破解法:
(用時長,消耗內存少)
public int[] twoSum(int[] nums, int target) {
for(int i=0;i<nums.length;i++){
for(int j=0;j<nums.length;j++){
if(i!=j&&target-nums[i]==nums[j])
return new int [] {i,j};
}
}
return null;
}
哈希表法:
(用時短,消耗內存多,以空間換時間)
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
int y=target-nums[i];
if(map.containsKey(y)){
return new int[] {map.get(y),i};
}
map.put(nums[i],i);
}
return null;
}
2. 兩數相加
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-two-numbers
這裏我被示例誤導了好幾次,事實上這兩個鏈表的長度並不固定,而且可能很長。我根據示例試圖使用val * 1+val * 10+val * 100…的方式進行計算,然而提交執行時的數據長達13個節點,直接導致了int數據溢出。
最終解題代碼:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int count=0,carry=0,sum;
ListNode ret=new ListNode(0),r=ret;
while(l1!=null||l2!=null){
if(l1!=null){
count+=l1.val;
l1=l1.next;
}
if(l2!=null){
count+=l2.val;
l2=l2.next;
}
sum=count+carry;
r.next=new ListNode(sum%10);
r=r.next;
carry=sum/10;
count=0;
}
if(carry!=0){
r.next=new ListNode(1);
}
return ret.next;
}
3. 無重複字符的最長子串
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: “abcabcbb”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “abc”,所以其長度爲 3。
示例 2:
輸入: “bbbbb”
輸出: 1
解釋: 因爲無重複字符的最長子串是 “b”,所以其長度爲 1。
示例 3:
輸入: “pwwkew”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “wke”,所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
這裏注意題目給的字符串將 " 也算作了內容,例如"a"字符串長度爲3,所以字符串的s.charAt(0) == s.charAt(s.length()-1)
必然成立,不需要擔心字符串從頭到尾沒有重複字符導致沒有賦值的情況。
輸入字符串可能出現爲""
或" "
,但因爲"爲字符串內容,對代碼沒有影響。
消耗時間,節省空間的方法:
public int lengthOfLongestSubstring(String s) {
System.out.println(s);
int maxcount=0,maxcountin,len=s.length();
for(int x=0;x<len;x++){
maxcountin=len-x;
for(int i=x;i<len;i++){
for(int j=(i+1);j<x+maxcountin;j++){
if(s.charAt(i)==s.charAt(j)){
if(maxcountin>(j-x)){
maxcountin=j-x;
}
break;
}
}
}
if(maxcount<maxcountin){
maxcount=maxcountin;
}
}
return maxcount;
}