1. 程式人生 > >LeetCode演算法練習-字串篇

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();//字串轉換成字元陣列
            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 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;
        }
    }

有效的字母異位詞

給定兩個字串 st ,編寫一個函式來判斷 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: