成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

力扣周結(jié)03

Render / 1130人閱讀

摘要:示例輸入輸出示例輸入輸出說(shuō)明輸出結(jié)果中的每個(gè)元素一定是唯一的。示例輸入輸出示例輸入輸出說(shuō)明輸出結(jié)果中每個(gè)元素出現(xiàn)的次數(shù),應(yīng)與元素在兩個(gè)數(shù)組中出現(xiàn)次數(shù)的最小值一致。在完成所有重復(fù)項(xiàng)刪除操作后返回最終的字符串。

242. 有效的字母異位詞

給定兩個(gè)字符串 s 和 t ,編寫(xiě)一個(gè)函數(shù)來(lái)判斷 t 是否是 s 的字母異位詞。

注意:若 s 和 t 中每個(gè)字符出現(xiàn)的次數(shù)都相同,則稱(chēng) s 和 t 互為字母異位詞。

示例 1:

輸入: s = "anagram", t = "nagaram"輸出: true

示例 2:

輸入: s = "rat", t = "car"輸出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • st 僅包含小寫(xiě)字母

解題思路

數(shù)組是一種最簡(jiǎn)單的哈希表,因?yàn)閮蓚€(gè)字符串只包含小寫(xiě)字母所以我們可以設(shè)置一個(gè)長(zhǎng)度為26的數(shù)組,0-25分別對(duì)應(yīng)a-z出現(xiàn)的次數(shù),最后再遍歷一次數(shù)組如果出現(xiàn)了不為1的元素就表明兩個(gè)字符串不是有效的字母異位詞

核心代碼

class Solution {    public boolean isAnagram(String s, String t) {        int[] result = new int[26];        for(int i = 0; i < s.length(); i++) {            result[s.charAt(i) - "a"]++;        }        for(int j = 0; j < t.length(); j++) {            result[t.charAt(j) - "a"]--;        }        for(int k = 0; k < 26; k++) {            if(result[k] != 0) {                return false;            }        }        return true;    }}

時(shí)間復(fù)雜度

O(n)

空間復(fù)雜度

O(1)

349. 兩個(gè)數(shù)組的交集

給定兩個(gè)數(shù)組,編寫(xiě)一個(gè)函數(shù)來(lái)計(jì)算它們的交集。

示例 1:

輸入:nums1 = [1,2,2,1], nums2 = [2,2]輸出:[2]

示例 2:

輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]輸出:[9,4]

說(shuō)明:

  • 輸出結(jié)果中的每個(gè)元素一定是唯一的。
  • 我們可以不考慮輸出結(jié)果的順序。

解題思路

這道題是虛假的求交集,即只是求出元素并不要求元素的個(gè)數(shù)所以我們可以聲明兩個(gè)set集合,然后將兩個(gè)set集合中包含的元素加入到結(jié)果數(shù)組中

也可以使用排序雙指針求解這里就不做演示了

核心代碼

class Solution {    public int[] intersection(int[] nums1, int[] nums2) {        HashSet<Integer> set = new HashSet<>();        HashSet<Integer> set0 = new HashSet<>();        int i = 0;        for(int item : nums1) {            set.add(item);        }        for(int item : nums2) {            if(set.contains(item))            set0.add(item);        }        int[] result = new int[set0.size()];        for(int item : set0) {            result[i] = item;            i++;        }        return result;    }}

時(shí)間復(fù)雜度

O(n)

空間復(fù)雜度

O(n)

350. 兩個(gè)數(shù)組的交集 II

給定兩個(gè)數(shù)組,編寫(xiě)一個(gè)函數(shù)來(lái)計(jì)算它們的交集。

示例 1:

輸入:nums1 = [1,2,2,1], nums2 = [2,2]輸出:[2,2]

示例 2:

輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]輸出:[4,9]

說(shuō)明:

  • 輸出結(jié)果中每個(gè)元素出現(xiàn)的次數(shù),應(yīng)與元素在兩個(gè)數(shù)組中出現(xiàn)次數(shù)的最小值一致。
  • 我們可以不考慮輸出結(jié)果的順序。

解題思路

真正的求交集,和上一題一樣也是兩種思路,排序雙指針的會(huì)簡(jiǎn)單一些

核心代碼

排序雙指針

class Solution {    public int[] intersect(int[] nums1, int[] nums2) {        //將數(shù)組排序        Arrays.sort(nums1);        Arrays.sort(nums2);        //定義雙指針?lè)謩e指向兩個(gè)數(shù)組的頭部        int a = 0, b = 0;        //定義結(jié)果集        int[] result = new int[Math.min(nums1.length,nums2.length)];        //定義遍歷結(jié)果集指針        int k = 0;        while(a < nums1.length && b < nums2.length) {            if(nums1[a] == nums2[b]) { //第一種情況:如果兩數(shù)相等就將數(shù)字加入到結(jié)果集中并讓兩個(gè)指針同時(shí)移動(dòng)                result[k++] = nums1[a];                a++;                b++;             } else if(nums1[a] > nums2[b]) { //第二種情況:如果第一個(gè)數(shù)組的值大于第二個(gè)數(shù)組那么就讓值小的數(shù)組的指針前移                b++;            } else { //第三種情況:如果第二個(gè)數(shù)組的值大于第一個(gè)數(shù)組那么就讓值小的數(shù)組的指針前移                a++;            }        }        return Arrays.copyOfRange(result, 0, k);    }}

時(shí)間復(fù)雜度

O(n)
空間復(fù)雜度

O(n)

兩個(gè)map模擬并集

class Solution {    public int[] intersect(int[] nums1, int[] nums2) {        //存儲(chǔ)第一數(shù)組的元素和個(gè)數(shù)的key和value        HashMap map0 = new HashMap<>();        //存儲(chǔ)第二個(gè)數(shù)組的元素和個(gè)數(shù)的key和value        HashMap map1 = new HashMap<>();        //存儲(chǔ)并集        HashMap temp = new HashMap<>();        //將第一數(shù)組的元素和對(duì)應(yīng)的元素存儲(chǔ)到map中        for(int i = 0; i < nums1.length; i++) {            if(map0.containsKey(nums1[i])) {                map0.replace(nums1[i], map0.get(nums1[i]) + 1);            } else {                map0.put(nums1[i], 1);            }        }        //將第二數(shù)組的元素和對(duì)應(yīng)的元素存儲(chǔ)到map中        for(int j = 0; j < nums2.length; j++) {            if(map1.containsKey(nums2[j])) {                map1.replace(nums2[j], map1.get(nums2[j]) + 1);            } else {                map1.put(nums2[j], 1);            }        }        //模擬并集的過(guò)程,將兩個(gè)數(shù)組的相同元素作為key并將元素個(gè)數(shù)的最小值作為value存儲(chǔ)到result結(jié)集合中        for(int index : map0.keySet()) {            if(map1.containsKey(index)) {                temp.put(index,Math.min(map0.get(index), map1.get(index)));            }        }        //定義數(shù)組長(zhǎng)度        int length = 0;        //將并集的長(zhǎng)度求出來(lái)        //具體做法為將result集合中所有的value求和        for(int index : temp.values()) {            length += index;        }        //定義返回?cái)?shù)組        int[] result = new int[length];         /**         * k 用來(lái)遍歷數(shù)組         * e 限制每個(gè)key的value循環(huán)         */        int k = 0, e = 0;        for(int index : temp.keySet()) {            e = 0;            while(e < temp.get(index)) {                result[k++] = index;                e++;            }        }        return result;    }}

時(shí)間復(fù)雜度

O(n)

空間復(fù)雜度

O(n)

202. 快樂(lè)數(shù)

編寫(xiě)一個(gè)算法來(lái)判斷一個(gè)數(shù) n 是不是快樂(lè)數(shù)。

「快樂(lè)數(shù)」定義為:

  • 對(duì)于一個(gè)正整數(shù),每一次將該數(shù)替換為它每個(gè)位置上的數(shù)字的平方和。
  • 然后重復(fù)這個(gè)過(guò)程直到這個(gè)數(shù)變?yōu)?1,也可能是 無(wú)限循環(huán) 但始終變不到 1。
  • 如果 可以變?yōu)?1,那么這個(gè)數(shù)就是快樂(lè)數(shù)。

如果 n 是快樂(lè)數(shù)就返回 true ;不是,則返回 false 。

示例 1:

輸入:n = 19輸出:true解釋?zhuān)?2 + 92 = 8282 + 22 = 6862 + 82 = 10012 + 02 + 02 = 1

示例 2:

輸入:n = 2輸出:false

提示:

  • 1 <= n <= 231 - 1

解題思路

將數(shù)通過(guò)%10分離個(gè)位數(shù)再通過(guò)/10移除個(gè)位數(shù)并讓其他位數(shù)順位減一,將分離完的個(gè)位數(shù)依次平方求和然后儲(chǔ)存到set集合中,循環(huán)這個(gè)過(guò)程,如果平方和和set中的元素重復(fù)那么這個(gè)數(shù)就不是快樂(lè)數(shù)

核心代碼

class Solution {    public boolean isHappy(int n) {        //定義哈希set存儲(chǔ)每次sum的值如果添加sum的時(shí)候sum重復(fù)了那就返回false        HashSet set = new HashSet<>();        int sum = n;        //如果sum不為1        while(sum != 1) {            if(set.contains(sum)){                return false;            }else{                set.add(sum);            }            sum = 0;            while(n != 0) {                sum += Math.pow(n % 10, 2);                n /= 10;            }            n = sum;        }        return true;        }}

時(shí)間復(fù)雜度

O(logn)

空間復(fù)雜度

O(logn)

1. 兩數(shù)之和

給定一個(gè)整數(shù)數(shù)組 nums 和一個(gè)整數(shù)目標(biāo)值 target,請(qǐng)你在該數(shù)組中找出 和為目標(biāo)值 target 的那 兩個(gè) 整數(shù),并返回它們的數(shù)組下標(biāo)。

你可以假設(shè)每種輸入只會(huì)對(duì)應(yīng)一個(gè)答案。但是,數(shù)組中同一個(gè)元素在答案里不能重復(fù)出現(xiàn)。

你可以按任意順序返回答案。

示例 1:

輸入:nums = [2,7,11,15], target = 9輸出:[0,1]解釋?zhuān)阂驗(yàn)?nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

輸入:nums = [3,2,4], target = 6輸出:[1,2]

示例 3:

輸入:nums = [3,3], target = 6輸出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只會(huì)存在一個(gè)有效答案

解題思路

這道題求解思路很多,暴力硬A的,二分查找,也可以使用哈希表來(lái)求得

使用目標(biāo)數(shù)字減去數(shù)組的值如果map中存在那么就返回這兩個(gè)值如果map中不存在那么就將這個(gè)數(shù)組元素和數(shù)組下標(biāo)存入map中

核心代碼

class Solution {    public int[] twoSum(int[] nums, int target) {        int[] result = new int[2];        if(nums == null || nums.length == 0) {            return result;        }        HashMap<Integer,Integer> map = new HashMap<>();        for(int i = 0; i < nums.length; i++) {            int temp = target - nums[i];            if(map.containsKey(temp)) {                result[0] = i;                result[1] = map.get(temp);                return result;            }            map.put(nums[i], i);        }        return result;    }}

時(shí)間復(fù)雜度

O(n)

空間復(fù)雜度

O(n)

454. 四數(shù)相加 II

給你四個(gè)整數(shù)數(shù)組 nums1、nums2、nums3 和 nums4 ,數(shù)組長(zhǎng)度都是 n ,請(qǐng)你計(jì)算有多少個(gè)元組 (i, j, k, l) 能滿(mǎn)足:

  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

示例 1:

輸入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]輸出:2解釋?zhuān)簝蓚€(gè)元組如下:1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 02. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0

示例 2:

輸入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]輸出:1

提示:

  • n == nums1.length
  • n == nums2.length
  • n == nums3.length
  • n == nums4.length
  • 1 <= n <= 200
  • -228 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 228

解題思路

因?yàn)轭}解的最后是需要得到能夠構(gòu)成0的個(gè)數(shù),所以我們可以將前兩個(gè)數(shù)組的元素之和求出同時(shí)統(tǒng)計(jì)出現(xiàn)的次數(shù)記錄到map中,然后再統(tǒng)計(jì)剩余元素的和,在map中尋找后兩個(gè)元素相加求和的相反數(shù)如果能找到就記錄出現(xiàn)的次數(shù)

核心代碼

class Solution {    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {        Map<Integer, Integer> map = new HashMap<>();        int temp;        int res = 0;        //統(tǒng)計(jì)兩個(gè)數(shù)組中的元素之和,同時(shí)統(tǒng)計(jì)出現(xiàn)的次數(shù),放入map        for (int i : nums1) {            for (int j : nums2) {                temp = i + j;                if (map.containsKey(temp)) {                    map.put(temp, map.get(temp) + 1);                } else {                    map.put(temp, 1);                }            }        }        //統(tǒng)計(jì)剩余的兩個(gè)元素的和,在map中找是否存在相加為0的情況,同時(shí)記錄次數(shù)        for (int i : nums3) {               for (int j : nums4) {                temp = i + j;                if (map.containsKey(0 - temp)) {                    res += map.get(0 - temp);                }            }        }        return res;        }}

時(shí)間復(fù)雜度

O(n^2)

空間復(fù)雜度

O(n)

383. 贖金信

為了不在贖金信中暴露字跡,從雜志上搜索各個(gè)需要的字母,組成單詞來(lái)表達(dá)意思。

給你一個(gè)贖金信 (ransomNote) 字符串和一個(gè)雜志(magazine)字符串,判斷 ransomNote 能不能由 magazines 里面的字符構(gòu)成。

如果可以構(gòu)成,返回 true ;否則返回 false 。

magazine 中的每個(gè)字符只能在 ransomNote 中使用一次。

示例 1:

輸入:ransomNote = "a", magazine = "b"輸出:false

示例 2:

輸入:ransomNote = "aa", magazine = "ab"輸出:false

示例 3:

輸入:ransomNote = "aa", magazine = "aab"輸出:true

提示:

  • 1 <= ransomNote.length, magazine.length <= 105
  • ansomNote 和 magazine 由小寫(xiě)英文字母組成

解題思路

因?yàn)橹恍枰猰agazine中的字符在ransomNote中出現(xiàn)的次數(shù)一致就可以了,所以我們用數(shù)組來(lái)記錄贖金信中的字母及其個(gè)數(shù),然后將雜志中的元素進(jìn)行比對(duì)

核心代碼

class Solution {    public boolean canConstruct(String ransomNote, String magazine) {        int[] result = new int[26];        for(int i = 0; i < ransomNote.length(); i++) { // 遍歷贖金信并記錄次數(shù)            result[ransomNote.charAt(i) - "a"]++;        }        for(int j = 0; j < magazine.length(); j++) { // 將雜志中的字符串和贖金信中的做比對(duì)            if(result[magazine.charAt(j) - "a"] != 0)            result[magazine.charAt(j) - "a"]--;        }        for(int i = 0; i < 26; i++) {            if(result[i] != 0)            return false;        }        return  true;    }}

時(shí)間復(fù)雜度

O(n + m)

空間復(fù)雜度

O(1)

15. 三數(shù)之和

給你一個(gè)包含 n 個(gè)整數(shù)的數(shù)組 nums,判斷 nums 中是否存在三個(gè)元素 a,b,c ,使得 a + b + c = 0 ?請(qǐng)你找出所有和為 0 且不重復(fù)的三元組。

注意:答案中不可以包含重復(fù)的三元組。

示例 1:

輸入:nums = [-1,0,1,2,-1,-4]輸出:[[-1,-1,2],[-1,0,1]]

示例 2:

輸入:nums = []輸出:[]

示例 3:

輸入:nums = [0]輸出:[]

解題思路

排序雙指針,首先確認(rèn)第一個(gè)元素,如果第一個(gè)元素大于0就沒(méi)有后續(xù)的必要了,因?yàn)椴豢梢园貜?fù)的三元組所以還涉及到了去重的操作,再確認(rèn)好第一個(gè)元素之后,剩下兩個(gè)元素的值也很好確認(rèn)可以使用雙指針來(lái)分別指向末尾和第一個(gè)元素后一位的元素

核心代碼

class Solution {    public List<List<Integer>> threeSum(int[] nums) {        //定義結(jié)果集LinkedList相比于ArrayList添加和刪除效率比較高        List> result = new LinkedList>();        //如果數(shù)組長(zhǎng)度小于3就不需要進(jìn)行后續(xù)操作了直接返回空的結(jié)果集即可        if(nums.length < 3) {            return result;        }        //我們采用排序雙指針的方法方便去重的操作        Arrays.sort(nums);        for(int i = 0; i < nums.length; i++) {            //因?yàn)閿?shù)組已經(jīng)排過(guò)序了如果第一個(gè)值是正數(shù)后面就沒(méi)必要比較了            if(nums[i] > 0)                break;            //如果從數(shù)組第二個(gè)值開(kāi)始,當(dāng)前元素和前一個(gè)元素相同那么直接跳過(guò)本次循環(huán)            if(i > 0 && nums[i - 1] == nums[i])                continue;            //a > b > c 由于第一個(gè)元素的確認(rèn)我們把他看作常數(shù)對(duì)待那么 滿(mǎn)足函數(shù) a(常數(shù)) + b(未知量) = -c(未知量) 形狀有點(diǎn)像 y = -x            int left = i + 1;            int right = nums.length - 1;            while(left < right) {                // temp = a + b + c                if(nums[left] + nums[right] == -nums[i]) {                    result.add(new LinkedList(Arrays.asList(nums[i], nums[left], nums[right])));                    left++;                    right--;                    //去重操作                    while(left < right && nums[left] == nums[left - 1])                        left++;                    while(left < right && nums[right] == nums[right + 1])                        right--;                                  } else if(nums[left] + nums[right] > -nums[i]) {                    right--;                } else if(nums[left] + nums[right] < -nums[i]) {                    left++;                }            }        }        return result;    }}

時(shí)間復(fù)雜度

O(n^2)

空間復(fù)雜度

O(n)

18. 四數(shù)之和

這道題和15題核心思路基本一致

class Solution {    public List<List<Integer>> fourSum(int[] nums, int target) {        //創(chuàng)建結(jié)果集        List> result = new LinkedList>();        if(nums.length < 4) {            return result;        }        //排序雙指針        Arrays.sort(nums);        for(int i = 0; i < nums.length - 3; i++) {            //去重            if(i > 0 && nums[i - 1] == nums[i]) {                continue;            }            for(int j = i + 1; j < nums.length - 2; j++) {                //去重                if(j > i + 1 && nums[j - 1] == nums[j]) {                    continue;                }                int left = j + 1;                int right = nums.length - 1;                int temp = target - nums[i] - nums[j];                while(left < right) {                    int sum = nums[left] + nums[right];                    if(sum == temp) {                        result.add(new LinkedList(Arrays.asList(nums[i], nums[j], nums[left], nums[right])));                        left++;                        right--;                        //去重                        while(left < right && nums[left] == nums[left - 1])                        left++;                        while(left < right && nums[right] == nums[right + 1])                        right--;                                            } else if(sum < temp) {                        left++;                    } else {                        right--;                    }                }            }        }        return result;    }}

232. 用棧實(shí)現(xiàn)隊(duì)列

請(qǐng)你僅使用兩個(gè)棧實(shí)現(xiàn)先入先出隊(duì)列。隊(duì)列應(yīng)當(dāng)支持一般隊(duì)列支持的所有操作(push、pop、peek、empty):

實(shí)現(xiàn) MyQueue 類(lèi):

  • void push(int x) 將元素 x 推到隊(duì)列的末尾
  • int pop() 從隊(duì)列的開(kāi)頭移除并返回元素
  • int peek() 返回隊(duì)列開(kāi)頭的元素
  • boolean empty() 如果隊(duì)列為空,返回 true ;否則,返回 false

解題思路

模擬題仔細(xì)就可以了

核心代碼

class MyQueue {    //定義兩個(gè)棧    Stack stack0 = null;    Stack stack1 = null;    //初始化兩個(gè)棧    public MyQueue() {        stack0 = new Stack<>();        stack1 = new Stack<>();    }    //如果棧1不為空那就先將棧1的元素全部出棧添加到棧0然后向棧0中添加新元素    public void push(int x) {        if(stack1.size() != 0) {            while(stack1.size() != 0) {                stack0.push(stack1.pop());            }        }        stack0.push(x);    }    //如果棧0中包含元素那么就將所有元素出棧并添加到棧1中移除并返回棧1的棧頂元素    public int pop() {        if(stack0.size() != 0) {            while(stack0.size() != 0) {                stack1.push(stack0.pop());            }        }        return stack1.pop();    }    //如果棧0中包含元素那么就將所有元素出棧并添加到棧1中返回棧1的棧頂元素    public int peek() {        if(stack0.size() != 0) {            while(stack0.size() != 0) {                stack1.push(stack0.pop());            }        }        return stack1.peek();    }    //查看棧0和棧1中是否含有元素    public boolean empty() {        return stack1.isEmpty() && stack0.isEmpty();    }}

225. 用隊(duì)列實(shí)現(xiàn)棧

解題思路

模擬題我是使用一個(gè)隊(duì)列實(shí)現(xiàn)的

核心代碼

class MyStack {    List<Integer> list0 = null;    //初始化隊(duì)列    public MyStack() {        list0 = new LinkedList();    }            public void push(int x) {        list0.add(x);    }        public int pop() {        return list0.remove(list0.size() - 1);    }        public int top() {        return list0.get(list0.size() - 1);    }        public boolean empty() {        return list0.isEmpty();    }}

20. 有效的括號(hào)

解題思路

棧很適合用來(lái)做匹配消除,遍歷整個(gè)字符串,如果棧中元素不為空并且棧頂元素和對(duì)應(yīng)的右括號(hào)匹配就彈出棧

核心代碼

class Solution {    public boolean isValid(String s) {        //定義一個(gè)棧        Stack stack = new Stack<>();        for(int i = 0; i < s.length(); i++) {            if(!stack.isEmpty() && stack.peek() == isType(s.charAt(i))) {                stack.pop();                continue;            }            stack.push(s.charAt(i));        }        return stack.isEmpty();    }    public char isType(char c) {        char flag = "/0";        if(c == ")") {            flag = "(";        }else if(c == "]") {            flag = "[";        }else if(c == "}") {            flag = "{";        }        return flag;    }}

時(shí)間復(fù)雜度

O(n)

空間復(fù)雜度

O(n)

1047. 刪除字符串中的所有相鄰重復(fù)項(xiàng)

給出由小寫(xiě)字母組成的字符串 S,重復(fù)項(xiàng)刪除操作會(huì)選擇兩個(gè)相鄰且相同的字母,并刪除它們。

在 S 上反復(fù)執(zhí)行重復(fù)項(xiàng)刪除操作,直到無(wú)法繼續(xù)刪除。

在完成所有重復(fù)項(xiàng)刪除操作后返回最終的字符串。答案保證唯一。

輸入:"abbaca"輸出:"ca"解釋?zhuān)豪?,?"abbaca" 中,我們可以刪除 "bb" 由于兩字母相鄰且相同,這是此時(shí)唯一可以執(zhí)行刪除操作的重復(fù)項(xiàng)。之后我們得到字符串 "aaca",其中又只有 "aa" 可以執(zhí)行重復(fù)項(xiàng)刪除操作,所以最后的字符串為 "ca"。

解題思路

  1. 消除相鄰且相同的元素第一種思路用棧來(lái)實(shí)現(xiàn)
  2. 使用Stringbuffer模擬棧
  3. 雙指針遍歷字符串,讓快慢指針同速前進(jìn),如果遇到需要?jiǎng)h除的元素就讓慢指針–下次循環(huán)直接就覆蓋了

核心代碼

/** * 第一種思路,用棧來(lái)實(shí)現(xiàn) * 依次將字符串的字符入棧如果兩兩相當(dāng),那么就消除 */class Solution {    public String removeDuplicates(String s) {        LinkedList<Character> queue = new LinkedList<>();        char temp;        for(int i = 0; i < s.length(); i++) {            temp = s.charAt(i);            // 如果棧為空或者棧頂元素不等于temp就入棧,否則就出棧            if(queue.isEmpty() || queue.peek() != temp) {                queue.push(temp);            } else {                queue.pop();            }        }        // 剩余的元素就是最終字符串,但是由于棧的結(jié)構(gòu)所以得出來(lái)的字符串是反的需要換一下        String result = "";        while(!queue.isEmpty()) {            result += queue.pop();        }        result = new StringBuffer(result).reverse().toString();        return result;    }}
/** * 第二種思路,字符串模擬棧 */class Solution {    public String removeDuplicates(String s) {        StringBuffer buffer = new StringBuffer();        char temp;        // 記錄buffer的長(zhǎng)度,為什么是-1?        // 之所以是-1是因?yàn)榈谝粋€(gè)元素是默認(rèn)添加的,它的索引值為0,此時(shí)為了能夠判斷第二次循環(huán)條件,        // l模仿指向棧頂        int l = -1;        for(int i = 0; i < s.length(); i++) {            temp = s.charAt(i);            // 如果此時(shí)字符串的尾部元素和temp相同那么就把字符串尾部刪除,為了添加第一個(gè)元素所以需要設(shè)置temp >= 0            if(l >= 0 && temp == buffer.charAt(l)) {                buffer.deleteCharAt(l);                l--;            } else {                buffer.append(temp);                l++;            }        }        return buffer.toString();    }}
/** * 第三種思路,雙指針?lè)?直接使用現(xiàn)有字符串使用雙指針覆蓋重復(fù)的元素 */class Solution {    public String removeDuplicates(String s) {        char[] c = s.toCharArray();        int slow = 0;        for(int fast = 0; fast < s.length(); fast++) {            c[slow] = c[fast];            // 如果slow指向的元素和slow-1所指向的元素相等那么就讓slow指針后移,下次循環(huán)直接就覆蓋掉了            if(slow > 0 && c[slow] == c[slow - 1]) {                slow--;            } else {                slow++;            }        }        return new String(c,0,slow);    }}

時(shí)間復(fù)雜度

  1. O(n)
  2. O(n)
  3. O(n)

空間復(fù)雜度

  1. O(n)
  2. O(n)
  3. O(1)

150. 逆波蘭表達(dá)式求值

根據(jù) 逆波蘭表示法,求表達(dá)式的值。

有效的算符包括 +、-、*、/ 。每個(gè)運(yùn)算對(duì)象可以是整數(shù),也可以是另一個(gè)逆波蘭表達(dá)式。

說(shuō)明:

  • 整數(shù)除法只保留整數(shù)部分。
  • 給定逆波蘭表達(dá)式總是有效的。換句話(huà)說(shuō),表達(dá)式總會(huì)得出有效數(shù)值且不存在除數(shù)為 0 的情況。

示例 1:

輸入:tokens = ["2","1","+","3","*"]輸出:9解釋?zhuān)涸撍闶睫D(zhuǎn)化為常見(jiàn)的中綴算術(shù)表達(dá)式為:((2 + 1) * 3) = 9

示例 2:

輸入:tokens = ["4","13","5","/","+"]輸出:6解釋?zhuān)涸撍闶睫D(zhuǎn)化為常見(jiàn)的中綴算術(shù)表達(dá)式為:(4 + (13 / 5)) = 6

解題思路

求解逆波蘭表達(dá)式,如果是數(shù)字直接入棧,如果是操作符,從棧中取出兩個(gè)元素進(jìn)行操作后再壓入棧

核心代碼

class Solution {    public int evalRPN(String[] tokens) {        //定義一個(gè)棧便于存儲(chǔ)運(yùn)算數(shù)字        Stack<Integer> stack = new Stack<Integer>();        //因?yàn)楸闅v到+ - * /需要出棧兩個(gè)字符計(jì)算后入棧所以設(shè)置兩個(gè)變量        int a = 0;        int b = 0;        for(int i = 0; i < tokens.length; i++) {            if ("+".equals(tokens[i])) {                a = stack.pop();                b = stack.pop();                stack.push(b + a);            } else if ("-".equals(tokens[i])) {                a = stack.pop();                b = stack.pop();                stack.push(b - a);            } else if ("*".equals(tokens[i])) 
            
                     
             
               

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/124497.html

相關(guān)文章

  • 思維導(dǎo)圖整理大廠面試高頻數(shù)組補(bǔ)充1: 最接近的三數(shù)之和 和 三數(shù)之和 的兩個(gè)不同之處, 力扣16

    摘要:此專(zhuān)欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn)當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解目的是為了更方便快捷的記憶和回憶算法重點(diǎn)不用每次都重復(fù)看題解畢竟算法不是做了一遍就能完全記住的所 ...

    longmon 評(píng)論0 收藏0
  • 力扣(LeetCode)310

    摘要:圖因此可以成為樹(shù),在所有可能的樹(shù)中,具有最小高度的樹(shù)被稱(chēng)為最小高度樹(shù)。給出這樣的一個(gè)圖,寫(xiě)出一個(gè)函數(shù)找到所有的最小高度樹(shù)并返回他們的根節(jié)點(diǎn)。因此使用一個(gè)數(shù)組代表每個(gè)節(jié)點(diǎn)的入度,若入度為就是葉子節(jié)點(diǎn)。 題目地址:https://leetcode-cn.com/probl...題目描述: 對(duì)于一個(gè)具有樹(shù)特征的無(wú)向圖,我們可選擇任何一個(gè)節(jié)點(diǎn)作為根。圖因此可以成為樹(shù),在所有可能的樹(shù)中,具有最小...

    amuqiao 評(píng)論0 收藏0
  • ??思維導(dǎo)圖整理大廠面試高頻數(shù)組9: 刪除重復(fù)元素的通解問(wèn)題, 力扣26/80??

    此專(zhuān)欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納, 整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn), 當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解. 目的是為了更方便快捷的記憶和回憶算法重點(diǎn)(不用每次都重復(fù)看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經(jīng)知道解題思路和方法, 想進(jìn)一步加強(qiáng)理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據(jù)題號(hào)先去力扣看看官方題解, 然后再看本文內(nèi)容). 關(guān)...

    MasonEast 評(píng)論0 收藏0
  • ??思維導(dǎo)圖整理大廠面試高頻數(shù)組19: 股票問(wèn)題III的dp數(shù)組構(gòu)建/初始化和空間優(yōu)化難點(diǎn), 力扣1

    此專(zhuān)欄文章是對(duì)力扣上算法題目各種方法的總結(jié)和歸納, 整理出最重要的思路和知識(shí)重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn), 當(dāng)然也會(huì)加上我對(duì)導(dǎo)圖的詳解. 目的是為了更方便快捷的記憶和回憶算法重點(diǎn)(不用每次都重復(fù)看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經(jīng)知道解題思路和方法, 想進(jìn)一步加強(qiáng)理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據(jù)題號(hào)先去力扣看看官方題解, 然后再看本文內(nèi)容). 關(guān)...

    劉福 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<