日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode练习(简单总结做过的题)

發布時間:2024/1/23 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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练习(简单总结做过的题)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。