LeetCode演算法練習-字串篇
反轉字串
請編寫一個函式,其功能是將輸入的字串反轉過來。
示例
輸入:s = "hello" 返回:"olleh"
思路
1、string 轉char[]陣列 然後依序遍歷 2、位運算 a^=b 交換位置 ab交換位置 我示例程式碼給這個思路的 效率會高一些
程式碼
class Solution { public String reverseString(String s) { if (null == s || s.length() == 0) return s; char[] ch = s.toCharArray();//字串轉換成字元陣列 intlen = s.length(); for (int i = 0; i < len / 2; i++) { ch[i] ^= ch[len - 1 - i];//位運算交換位置 ch[len - 1 - i] ^= ch[i]; ch[i] ^= ch[len - 1 - i]; } return new String(ch); } }
反轉整數
給定一個 32 位有符號整數,將整數中的數字進行反轉。
示例
輸入: 123 輸出: 321 輸入: -123 輸出: -321 輸入: 120 輸出: 21 //假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−231, 231 − 1]。 //根據這個假設,如果反轉後的整數溢位,則返回 0。
思路
1、判斷符號 2、反轉數字 3、去0 並轉成數字 4、如果拋異常就返回0
程式碼
class Solution { public int reverse(int x) { boolean isF = x < 0; String value = String.valueOf(Math.abs(x)); char[] chars = value.toCharArray(); int len = chars.length; for (int i = 0; i < len / 2; i++) { chars[i] ^= chars[len - 1 - i];//位運算交換位置 chars[len - 1 - i] ^= chars[i]; chars[i] ^= chars[len - 1 - i]; } value = new String(chars); if (chars[0] == 0) value = value.substring(1); try { if (isF) return -1 * Integer.parseInt(value); return Integer.parseInt(value); } catch (Exception e) { return 0; } } }
字串中的第一個唯一字元
給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -1。
示例
s = "leetcode" 返回 0. s = "loveleetcode", 返回 2. //您可以假定該字串只包含小寫字母。
思路
//建立Hash表 排除重複選項 再遍歷hash表 判斷是否有唯一字元
程式碼
class Solution { public int firstUniqChar(String s) { int index = -1; if (s == null) return index; Map<Character, Integer> chMap = new LinkedHashMap<>(); for (char c : s.toCharArray()) { if (!chMap.containsKey(c)) { chMap.put(c, 1); } else { chMap.put(c, chMap.get(c) + 1); } } for (Character key : chMap.keySet()) { if (chMap.get(key) == 1) return s.indexOf(String.valueOf(key)); } return index; } }
有效的字母異位詞
給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的一個字母異位詞。
示例
s = "anagram",t = "nagaram",返回 true s = "rat",t = "car",返回 false 注意:假定字串只包含小寫字母。 提升難度: 輸入的字串包含 unicode 字元怎麼辦?你能能否調整你的解法來適應這種情況?
思路
1.將兩個字串轉換為字串陣列
2.排序陣列
3.判斷兩個陣列的元素是否相同(用系統自帶的方法了,你也可以遍歷,其實系統方法內部實現原理也不一樣是遍歷)
程式碼
class Solution { public boolean isAnagram(String s, String t) { if (s.length() != t.length()) return false; // if (s.length() == 1 && t.length() == 1) return s.equals(t); char[] sch = s.toCharArray(); char[] tch = t.toCharArray(); Arrays.sort(sch); Arrays.sort(tch); return Arrays.equals(sch, tch); } }
驗證迴文字串
給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。
說明:本題中,我們將空字串定義為有效的迴文串。
示例
輸入: "A man, a plan, a canal: Panama" 輸出: true 輸入: "race a car" 輸出: false
思路
1.替換字串中的所有空格 如果替換完的字串為空 則返回true 空格為有效的迴文串 2.提出除英文字元和數字以外所有的特殊字元並將大寫轉換為小寫 3.翻轉字串 4.判斷翻轉後的字串與翻轉前的字串是否相等
程式碼
class Solution { public boolean isPalindrome(String s) { if (s.length() == 1) return true; String p = s.replace(" ", ""); if (p.equals("")) return true; s = p.replaceAll("[^a-z0-9A-Z]", "").toLowerCase(); char[] ch = s.toCharArray(); int len = s.length(); for (int i = 0; i < len / 2; i++) { ch[i] ^= ch[len - 1 - i];//位運算交換位置 ch[len - 1 - i] ^= ch[i]; ch[i] ^= ch[len - 1 - i]; } return s.equals(new String(ch)); } } //另外一種寫法 class Solution { public boolean isPalindrome(String s) { if (s.length() == 1) return true; if (s.replace(" ", "").equals("")) return true; s = s.replaceAll("[^a-z0-9A-Z]", ""); return s.equalsIgnoreCase(new StringBuffer(s).reverse().toString()); } }
字串轉整數(atoi)
實現 atoi
,將字串轉為整數。
在找到第一個非空字元之前,需要移除掉字串中的空格字元。如果第一個非空字元是正號或負號,選取該符號,並將其與後面儘可能多的連續的數字組合起來,這部分字元即為整數的值。如果第一個非空字元是數字,則直接將其與之後連續的數字字元組合起來,形成整數。
字串可以在形成整數的字元後面包括多餘的字元,這些字元可以被忽略,它們對於函式沒有影響。
當字串中的第一個非空字元序列不是個有效的整數;或字串為空;或字串僅包含空白字元時,則不進行轉換。
若函式不能執行有效的轉換,返回 0。
說明:
假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−231, 231 − 1]。如果數值超過可表示的範圍,則返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例
輸入: "42" 輸出: 42 輸入: " -42" 輸出: -42 解釋: 第一個非空白字元為 '-', 它是一個負號。 我們儘可能將負號與後面所有連續出現的數字組合起來,最後得到 -42 。 輸入: "4193 with words" 輸出: 4193 解釋: 轉換截止於數字 '3' ,因為它的下一個字元不為數字。 輸入: "words and 987" 輸出: 0 解釋: 第一個非空字元是 'w', 但它不是數字或正、負號。 因此無法執行有效的轉換。 輸入: "-91283472332" 輸出: -2147483648 解釋: 數字 "-91283472332" 超過 32 位有符號整數範圍。 因此返回 INT_MIN (−231) 。
思路
去除字串兩端空字元 攔截輸入字元只是相關推薦
LeetCode演算法練習-字串篇
反轉字串請編寫一個函式,其功能是將輸入的字串反轉過來。示例輸入:s = "hello" 返回:"olleh"思路1、string 轉char[]陣列 然後依序遍歷 2、位運算 a^=b 交換位置 ab交換位置 我示例程式碼給這個思路的 效率會高一些程式碼class Solut
Leetcode演算法練習-easy篇-Roman to Integer
題目簡述: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 上圖: 本題解法: int retVa
Leetcode演算法練習-easy篇-Reverse Integer
Leetcode演算法練習## easy篇-Reverse Integer 最近正式入駐Leetcode,從今天開始會陸陸續續的整理在Leetcode 上的題目,用於筆記的整理與交流,而且除了自己的做法之外還會整理一些其他的好演算法,並進行簡單的分析與分享,考慮到演算法的訓練並不多,
LeetCode初級演算法練習——陣列篇
陣列篇26. 從排序陣列中刪除重複項給定一個有序陣列,你需要原地刪除其中的重複內容,使每個元素只出現一次,並返回新的長度。不要另外定義一個數組,您必須通過用 O(1) 額外記憶體原地修改輸入的陣列來做到這一點。示例:給定陣列: nums = [1,1,2], 你的函式應該返
leetcode演算法之陣列篇(題35):搜尋插入位置
題目:給定一個排序陣列和一個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。 示例 1:輸入: [1,3,5,6], 5 &nbs
leetcode演算法之陣列篇(題27):移除元素
題目:給定一個數組 nums 和一個值 val,你需要原地移除所有數值等於 val 的元素,返回移除後陣列的新長度。 不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1) 額外空間的條件下完成。 元素的順序可以改變。你不需要考慮
leetcode演算法之陣列篇(題26):刪除排序陣列中的重複項
給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。 不要使用額外的陣列空間,你必須在原地修改輸入陣列,並在使用 O(1) 額外空間的條件下完成。 示例 1:給定陣列 nums = [1,1,2], 函式應該返回新的長度 2, 並且原陣
玩轉演算法面試LeetCode演算法練習——二分搜尋樹
目錄 235. 二叉搜尋樹的最近公共祖先 給定一個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。 百度百科中最近公共祖先的定義為:“對於有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深
LeetCode演算法練習( 無重複字元的最長子串)
本文內容: 1、我的正確解答 2、官方的解答:暫時沒有 1、我的正確解答 class Solution2 { /** * 思路:迴圈遍歷字串,找到所有滿足條件的字串,將這些字串的長度排序,找到最長的返回 * * @p
[LeetCode][演算法初級][字串]39 數數並說 (count and say)
題目挺奇怪的,看了一會才知道是什麼意思。。就是讓你去數一個字串的數字,並且把你說出來的內容作為下一個字串繼續數。比如:第一個字串是“1”,你就要數:"1個1!",同時寫下”11“作為下一個字串。然後你再數”2個1!“同時寫下”21“. 然後再數”1個2,1個1 !“,那麼下一
LeetCode演算法練習——深度優先搜尋 DFS
很久都沒有刷LeetCode了,上次LeetCode已經快是兩個月之前的事情了。現在繼續。之前中級演算法差不多刷完了,這次專練資料結構。這一篇主要是dfs題目,標識為簡單的題目一般就跳過了,主要刷中等與困難題。 LeetCode上分類為dfs的題目大多數與
【LeetCode演算法練習(C++)】Count and Say
題目: The count-and-say sequence is the sequence of integers with the first five terms as following: 1. 1 2. 11 3. 2
玩轉演算法面試LeetCode演算法練習——基礎算法系列
目錄 75. 分類顏色 給定一個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。 此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。 注意: 不能使用程式碼庫中的
玩轉演算法面試LeetCode演算法練習——二叉樹與遞迴
目錄 104. 二叉樹的最大深度 給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,n
玩轉演算法面試LeetCode演算法練習——雙向佇列【堆(heapq)】
347. 前K個高頻元素 給定一個非空的整數陣列,返回其中出現頻率前 k 高的元素。 例如, 給定陣列 [1,1,1,2,2,3] , 和 k = 2,返回 [1,2]。 注意: 你可以假設給定的 k 總是合理的,1 ≤ k ≤ 陣列中不相同的元素的個數。 你的演
Leetcode演算法——32、最長有效括號字串
給定一個字串,只包含’(‘和’)’。 要求找到最長的有效的子串。 Example 1: Input: “(()” Output: 2 Explanation: The longest valid parentheses substring is “()” Example 2:
LeetCode演算法題8:字串轉換整數 (atoi)解析
請你來實現一個 atoi 函式,使其能將字串轉換成整數。 首先,該函式會根據需要丟棄無用的開頭空格字元,直到尋找到第一個非空格的字元為止。 當我們尋找到的第一個非空字元為正或者負號時,則將該符號與之後面儘可能多的連續數字組合起來,作為該整數的正負號;假如第一個非空字元是數字,則直接將
Leetcode演算法Java全解答--43. 字串相乘
Leetcode演算法Java全解答–43. 字串相乘 文章目錄 Leetcode演算法Java全解答--43. 字串相乘 題目 想法 結果 總結 程式碼 我的答案 大佬們的答案
C++ Leetcode初級演算法之字串中的第一個唯一字元
給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -1。 案例: s = “leetcode” 返回 0. s = “loveleetcode”, 返回 2. 注意事項:您可以假定該字串只包含小寫字母。 class Solution { pub
C++ Leetcode初級演算法之其他篇
1.位1的個數 編寫一個函式,輸入是一個無符號整數,返回其二進位制表示式中數字位數為 ‘1’ 的個數(也被稱為漢明重量)。 示例 : 輸入: 11 輸出: 3 解釋: 整數 11 的二進位制表示為 00000000000000000000000000001011 示例 2: