leetcode练习(简单总结做过的题)
文章目錄
- leetcode(簡單總結做過的題)
- 兩數之和:`簡單`
- 整數反轉:`簡單`
- 回文數:`簡單`
- 羅馬數字轉整數:`簡單`
- 最長公共前綴:`簡單`
- 有效的括號:`簡單`
- 合并兩個有序的鏈表:`簡單`
- 刪除排序數組中的重復項:`簡單`
- 移除元素:`簡單`
- 實現strStr()函數:`簡單`
- 搜索插入位置:`簡單`
- 兩數相加:`中等`
- 無重復字符的最長字串:`中等`
leetcode(簡單總結做過的題)
題目來源:力扣(LeetCode)
兩數之和:簡單
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,并返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。
示例:
給定 nums = [2, 7, 11, 15], target = 9因為 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]題解:
class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> map = new HashMap<>();for(int i=0;i<nums.length;i++){int temp = target - nums[i];if(map.containsKey(temp)){//nums的第一個值會存入map return new int[]{map.get(temp),i};//將兩個索引值返回}map.put(nums[i],i); //將數與索引值一起存入map}return new int[]{-1,-1};} } // for(int i=0;i<nums.length;i++){// for(int j=i+1;j<nums.length;j++){// if(nums[i]==target-nums[j]){// return new int[]{i,j};// }// }// }// throw new IllegalArgumentException("No two sum solution");// }整數反轉:簡單
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:
假設我們的環境只能存儲得下 32 位的有符號整數,則其數值范圍為 [?231, 231 ? 1]。請根據這個假設,如果反轉后整數溢出那么就返回 0。
題解:
class Solution {public int reverse(int x) {long y=0;while(x != 0){y = x%10 + y*10;x=x/10;}return (int)y==y?(int)y:0;//要考慮是否溢出} }回文數:簡單
判斷一個整數是否是回文數。回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
示例 1:
輸入: 121
輸出: true
示例 2:
輸入: -121
輸出: false
解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個回文數。
示例 3:
輸入: 10
輸出: false
解釋: 從右向左讀, 為 01 。因此它不是一個回文數。
進階:
你能不將整數轉為字符串來解決這個問題嗎?
題解:(1)
class Solution {public boolean isPalindrome(int x) {if(x<0){return false;}String s = Integer.toString(x); //轉換成字符串String sf =new StringBuilder(s).reverse().toString(); //將字符串反轉if(sf.equals(s)){return true;}return false;} }題解:(2)
class Solution {public boolean isPalindrome(int x) {if (x < 0 || (x % 10 == 0 && x != 0)) { //當x為負數或x為10的倍數時,x不是回文數return false;}int revertedNumber = 0;while (x > revertedNumber) {revertedNumber = revertedNumber * 10 + x % 10;x /= 10;}//當x是偶數位時,x==revertedNumber,例如1221;當x是奇數位時,x == revertedNumber / 10,例如121return x == revertedNumber || x == revertedNumber / 10;} }羅馬數字轉整數:簡單
羅馬數字包含以下七種字符: I, V, X, L,C,D 和 M。
字符 數值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 羅馬數字 2 寫做 II ,即為兩個并列的 1。12 寫做 XII ,即為 X + II 。 27 寫做 XXVII, 即為 XX + V + II 。
通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 IIII,而是 IV。數字 1 在數字 5 的左邊,所表示的數等于大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 IX。這個特殊的規則只適用于以下六種情況:
I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。
給定一個羅馬數字,將其轉換成整數。輸入確保在 1 到 3999 的范圍內。
示例 1:
輸入: “III”
輸出: 3
示例 2:
輸入: “IV”
輸出: 4
示例 3:
輸入: “IX”
輸出: 9
示例 4:
輸入: “LVIII”
輸出: 58
解釋: L = 50, V= 5, III = 3.
示例 5:
輸入: “MCMXCIV”
輸出: 1994
解釋: M = 1000, CM = 900, XC = 90, IV = 4.
題解:
class Solution {public int romanToInt(String s) {int sum=0;int pre = getValue(s.charAt(0));for(int i=1;i<s.length();i++){int back = getValue(s.charAt(i));if(pre < back){ //小于情況例如:IV,則需要減去Isum-=pre;}else{sum+=pre; //III}pre = back;}sum+=pre;return sum;}private int getValue(char c){switch(c){case 'I': return 1;case 'V': return 5;case 'X': return 10;case 'L': return 50;case 'C': return 100;case 'D': return 500;case 'M': return 1000;default: return 0;}} }最長公共前綴:簡單
編寫一個函數來查找字符串數組中的最長公共前綴。
如果不存在公共前綴,返回空字符串 “”。
示例 1:
輸入: [“flower”,“flow”,“flight”]
輸出: “fl”
示例 2:
輸入: [“dog”,“racecar”,“car”]
輸出: “”
解釋: 輸入不存在公共前綴。
說明:
所有輸入只包含小寫字母 a-z 。
題解:
class Solution {public String longestCommonPrefix(String[] strs) {if(strs == null || strs.length == 0){ //若為空則返回空字符串return "";}String prefix = strs[0];for(int i=1;i<strs.length;++i){prefix = CompareStrings(prefix,strs[i]);if(prefix.length() == 0){break;//只要其中兩個沒有公共的,則退出循環}}return prefix;}private String CompareStrings(String a,String b){int len = Math.min(a.length(),b.length());//取短的那個字符串的長度int i=0;while(i<len && a.charAt(i)==b.charAt(i)){ //比較兩個字符串的字符i++;}return a.substring(0,i);//截取公共前綴} }有效的括號:簡單
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認為是有效字符串。
示例 1:
輸入: “()”
輸出: true
示例 2:
輸入: “()[]{}”
輸出: true
示例 3:
輸入: “(]”
輸出: false
示例 4:
輸入: “([)]”
輸出: false
示例 5:
輸入: “{[]}”
輸出: true
題解:
class Solution {private Map<Character,Character> map;public Solution(){ //初始化mapthis.map = new HashMap<Character,Character>();this.map.put(')','(');this.map.put(']','[');this.map.put('}','{');}public boolean isValid(String s) {if(s.length() % 2 != 0){return false;}Stack<Character> stack = new Stack<Character>();//new一個字符串棧(先進后出)for(int i=0;i<s.length();i++){char c = s.charAt(i);if(this.map.containsKey(c)){ // ( {不是key,所以進棧 } )是key,所以進行下一步char ck = stack.empty() ? '#':stack.pop();//按順序出棧 { (if(ck != this.map.get(c)){ //若不匹配則為falsereturn false;}}else{stack.push(c); // ( {}}return stack.isEmpty();} }合并兩個有序的鏈表:簡單
將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例:
輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
題解:
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/ class Solution {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {ListNode p=l1,q=l2;if(p==null){return q;}if(q==null){return p;}if(p.val < q.val){p.next = mergeTwoLists(p.next,q); //遞歸思想,一開始沒想到!return p;}else{q.next = mergeTwoLists(p,q.next);return q;}} }刪除排序數組中的重復項:簡單
給定一個排序數組,你需要在 原地 刪除重復出現的元素,使得每個元素只出現一次,返回移除后數組的新長度。
不要使用額外的數組空間,你必須在 原地 修改輸入數組 并在使用 O(1) 額外空間的條件下完成。
示例 1:
給定數組 nums = [1,1,2],
函數應該返回新的長度 2, 并且原數組 nums 的前兩個元素被修改為 1, 2。
你不需要考慮數組中超出新長度后面的元素。
示例 2:
給定 nums = [0,0,1,1,1,2,2,3,3,4],
函數應該返回新的長度 5, 并且原數組 nums 的前五個元素被修改為 0, 1, 2, 3, 4。
你不需要考慮數組中超出新長度后面的元素。
題解:
class Solution {public int removeDuplicates(int[] nums) {if(nums.length == 0){return 0;}int len=0;for(int i=1;i<nums.length;i++){if(nums[i] != nums[len]){ //只有不相等的時候才把后面的元素一一放到指定的下一個位置len++;nums[len]=nums[i];}}return len+1;} }移除元素:簡單
給你一個數組 nums 和一個值 val,你需要 原地 移除所有數值等于 val 的元素,并返回移除后數組的新長度。
不要使用額外的數組空間,你必須僅使用 O(1) 額外空間并 原地 修改輸入數組。
元素的順序可以改變。你不需要考慮數組中超出新長度后面的元素。
示例 1:
給定 nums = [3,2,2,3], val = 3,
函數應該返回新的長度 2, 并且 nums 中的前兩個元素均為 2。
你不需要考慮數組中超出新長度后面的元素。
示例 2:
給定 nums = [0,1,2,2,3,0,4,2], val = 2,
函數應該返回新的長度 5, 并且 nums 中的前五個元素為 0, 1, 3, 0, 4。
注意這五個元素可為任意順序。
你不需要考慮數組中超出新長度后面的元素。
題解:
class Solution {public int removeElement(int[] nums, int val) {int len = 0;for(int i=0;i<nums.length;++i){if(nums[i] != val){nums[len] = nums[i]; //跟上一題的思路相同len++;}}return len;} }實現strStr()函數:簡單
實現 strStr() 函數。
給定一個 haystack 字符串和一個 needle 字符串,在 haystack 字符串中找出 needle 字符串出現的第一個位置 (從0開始)。如果不存在,則返回 -1。
示例 1:
輸入: haystack = “hello”, needle = “ll”
輸出: 2
示例 2:
輸入: haystack = “aaaaa”, needle = “bba”
輸出: -1
說明:
當 needle 是空字符串時,我們應當返回什么值呢?這是一個在面試中很好的問題。
對于本題而言,當 needle 是空字符串時我們應當返回 0 。這與C語言的 strstr() 以及 Java的 indexOf() 定義相符。
題解:(1)
class Solution {public int strStr(String haystack, String needle) {int len1 = haystack.length(),len2 = needle.length();for(int i=0;i<len1-len2+1;i++){if(haystack.substring(i,i+len2).equals(needle)){ //通過截取字符串來比較substringreturn i;}}return -1;} }題解:(2)
class Solution {public int strStr(String haystack, String needle) {int len1 = haystack.length(),len2 = needle.length();if(len2 == 0){return 0;}for(int i=0;i<len1-len2+1;i++){if(haystack.charAt(i) == needle.charAt(0)){if(haystack.substring(i,i+len2).equals(needle)){return i;}}}return -1; } }//參考的javascript解法:(見下) var strStr = function (haystack, needle) {if (needle === "") return 0for (var i = 0; i < haystack.length; i++) {if (haystack[i] === needle[0]) {if (haystack.substring(i, i + needle.length) === needle) return i;}}return -1 };搜索插入位置:簡單
給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置。
你可以假設數組中無重復元素。
示例 1:
輸入: [1,3,5,6], 5
輸出: 2
示例 2:
輸入: [1,3,5,6], 2
輸出: 1
示例 3:
輸入: [1,3,5,6], 7
輸出: 4
示例 4:
輸入: [1,3,5,6], 0
輸出: 0
題解:
class Solution {public int searchInsert(int[] nums, int target) {//二分法查找int len = nums.length;if(len == 0){return 0;}if(nums[len - 1] < target){return len;}int left=0;int right=len-1;while(left < right){int middle=left+(right-left)/2; //中間指針if(nums[middle] < target){// 下一輪搜索區間是 [mid + 1, right]left = middle+1;}else{// 下一輪搜索區間是 [left, mid]right = middle;}}return left;} }兩數相加:中等
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,并且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
題解:
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/ class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode head=new ListNode(0);//輸出的鏈表頭ListNode p=l1,q=l2,cur=head;int a=0; //進位的數記錄while(p!=null || q!=null){int x=(p!=null)?p.val:0;int y=(q!=null)?q.val:0;int s=a+x+y;a=s/10;cur.next = new ListNode(s%10);cur=cur.next;if(p!=null) p=p.next;if(q!=null) q=q.next;}if(a>0){ //若最后還有進位,則a=1cur.next=new ListNode(a);}return head.next;//head->7->0->8} }無重復字符的最長字串:中等
給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度。
示例 1:
輸入: “abcabcbb”
輸出: 3
解釋: 因為無重復字符的最長子串是 “abc”,所以其長度為 3。
示例 2:
輸入: “bbbbb”
輸出: 1
解釋: 因為無重復字符的最長子串是 “b”,所以其長度為 1。
示例 3:
輸入: “pwwkew”
輸出: 3
解釋: 因為無重復字符的最長子串是 “wke”,所以其長度為 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。
題解:
class Solution {public int lengthOfLongestSubstring(String s) {Set<Character> son = new HashSet<Character>();// 右指針,初始值為 -1,相當于我們在字符串的左邊界的左側,還沒有開始移動int point = -1,len = 0;for(int i=0;i<s.length();++i){if(i!=0){// 左指針向右移動一格,移除一個字符son.remove(s.charAt(i-1));}while(point+1<s.length() && !son.contains(s.charAt(point+1))){// 不斷地移動右指針(向右)son.add(s.charAt(point+1));++point;}len = Math.max(len,point-i+1);//取最大的長度}return len;} }總結
以上是生活随笔為你收集整理的leetcode练习(简单总结做过的题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十大排序算法(Java)
- 下一篇: 百度提前批-百度智能小程序(面经详解)