LeetCode 算法日常

解題思路來源于網(wǎng)絡(luò)和 awesome-java-leetcode
本菜鳥以小白的眼光去解釋大神的思路良哲。

Easy

1.Two Sum

Given an array of integers, return indices(index 的復(fù)數(shù)) of the two numbers such that they add up to a specific(具體的吃溅、特定的) target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

題意為:給定一個整數(shù)數(shù)組,從中找到兩個數(shù)字使它們相加等于一個值,最后得到兩個數(shù)字在數(shù)組中的下標(biāo)谨朝。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int length = nums.length;
        HashMap<Integer,Integer> map = new HashMap<>();
        for(int i = 0; i < length; i++){
             // 如果map存在和當(dāng)前數(shù)相加等于目標(biāo)值的數(shù),說明這兩個數(shù)滿足了條件
            if(map.containsKey(nums[i])){
                // 取出該數(shù)在 map 中的下標(biāo)抽碌,同時也是它在 nums 中的下標(biāo)旺订,因為下文放入了
                // 另外取出當(dāng)前循環(huán)的值的下標(biāo),因為該下標(biāo)表示的值滿足條件
                return new int[]{map.get(nums[i]),i};
            }
            // map 儲存目標(biāo)減去數(shù)組中的值
            map.put(target - nums[i],i);
        }
        return null;
    }
}

7.Reverse Integer

Given a 32-bit signed integer, reverse digits of an integer.

Example 1:

Input: 123
Output:  321

Example 2:

Input: -123
Output: -321

Example 3:

Input: 120
Output: 21

Note:
Assume we are dealing with an environment which could only hold integers within the 32-bit signed integer range. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

題意為:給定一個32位整型數(shù)赠摇,返回它的逆序整型數(shù)固逗。Note:當(dāng)它的逆序整型數(shù)溢出的話,那么就返回 0藕帜。

思路 0:

class Solution {
    public int reverse(int x) {
        // 先用一個long類型來保存數(shù)據(jù)
        long r = 0;
        while(x != 0){
            // 第一次循環(huán):取 x 的最小位并賦值給 r烫罩,比如 123 先取余數(shù) 3
            // 第二次循環(huán):讓上次取的余數(shù)*10變?yōu)槭孜唬?dāng)前 x=12 因為x/=10并且x是整數(shù)類型洽故,再次取余數(shù) 2
            // 循環(huán)提升末位贝攒,并不斷添加最小位
            r = r * 10 + x % 10;
            x /= 10;
        }
        // 判斷如果范圍溢出返回0
        if(r < Integer.MIN_VALUE || r > Integer.MAX_VALUE){
            return 0;
        }else{
            return (int)r;
        }
    }
}

簡化后寫法:

class Solution {
    public int reverse(int x) {
        long res = 0;
        for(; x != 0; x /= 10){
            res = res*10 + x%10;
        }
        return res < Integer.MIN_VALUE || res > Integer.MAX_VALUE ? 0 : (int)res;
    }
}

9.Palindrome Number

Determine whether an integer is a palindrome. Do this without extra space.

Some hints:
Could negative integers be palindromes? (ie, -1)

If you are thinking of converting the integer to string, note the restriction of using extra space.

You could also try reversing an integer. However, if you have solved the problem "Reverse Integer", you know that the reversed integer might overflow. How would you handle such case?

There is a more generic way of solving this problem.

題意為:判斷一個有符號整型數(shù)是否是回文,也就是逆序過來的整數(shù)和原整數(shù)相同时甚。負整數(shù)肯定不是隘弊,逆序過后符號放后了哈踱。

解 0:

class Solution {
    // 沒什么好說的,把整數(shù)倒過來判定
    public boolean isPalindrome(int x) {
        if(x < 0) return false;
        int num = 0;
        int copyX = x;
        while(copyX > 0){
            num = num * 10 + copyX % 10;
            copyX/=10;
        }
        return num == x;
    }
}

解 1:

class Solution {
    public boolean isPalindrome(int x) {
        // 循環(huán)一半和不判定10的倍數(shù)
        if (x < 0 || (x != 0 && x % 10 == 0)) return false;
        int halfReverseX = 0;
        while (x > halfReverseX) {
            halfReverseX = halfReverseX * 10 + x % 10;
            x /= 10;
        }
        return halfReverseX == x || halfReverseX / 10 == x;
    }
}

13. Roman to Integer

Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.

題意為:給定一個羅馬數(shù)字梨熙,轉(zhuǎn)換為整數(shù) Integer开镣。
范圍為 1 - 3999.

百度百科羅馬數(shù)字介紹:
羅馬數(shù)字是阿拉伯?dāng)?shù)字傳入之前使用的一種數(shù)碼。羅馬數(shù)字采用七個羅馬字母作數(shù)字咽扇、即Ⅰ(1)邪财、X(10)、C(100)肌割、M(1000)卧蜓、V(5)、L(50)把敞、D(500)弥奸。記數(shù)的方法:

  • 相同的數(shù)字連寫,所表示的數(shù)等于這些數(shù)字相加得到的數(shù)奋早,如 Ⅲ=3盛霎;
  • 小的數(shù)字在大的數(shù)字的右邊,所表示的數(shù)等于這些數(shù)字相加得到的數(shù)耽装,如 Ⅷ=8愤炸、Ⅻ=12;
  • 小的數(shù)字(限于 Ⅰ掉奄、X 和 C)在大的數(shù)字的左邊规个,所表示的數(shù)等于大數(shù)減小數(shù)得到的數(shù),如 Ⅳ=4姓建、Ⅸ=9诞仓;
  • 在一個數(shù)的上面畫一條橫線,表示這個數(shù)增值 1,000 倍速兔,如
image

等于5000墅拭。

class Solution {
    public int romanToInt(String s) {
        // 先把所有羅馬英文字母添加到Map
        Map<Character,Integer> map = new HashMap<>();
        map.put('I',1);
        map.put('V',5);
        map.put('X',10);
        map.put('L',50);
        map.put('C',100);
        map.put('D',500);
        map.put('M',1000);
        int length = s.length();
        int sum = map.get(s.charAt(length - 1));
        // 拿最后一個字母跟前一個相比如果小就需要減,否則加
        for(int i = length - 2;i >= 0; i--){
            if(map.get(s.charAt(i)) < map.get(s.charAt(i + 1))){
                sum -= map.get(s.charAt(i));
            }else{
                sum += map.get(s.charAt(i));
            }
        }
        return sum;
    }
}

14. Longest Common Prefix

Write a function to find the longest common prefix string amongst an array of strings.

題意為:給定一個字符串?dāng)?shù)組涣狗,得出數(shù)組中這些字符串的公共開頭字符串谍婉。比如 "leeta" 和 "leetb" 的公共開頭為 "leet"。

解題思路 0:

public String longestCommonPrefix(String[] strs) {
    if (strs.length == 0) return ""; 
    String prefix = strs[0];
    // 遍歷字符數(shù)組镀钓,用來跟首個元素作對比
    for (int i = 1; i < strs.length; i++)
        // 因為 prefix 就是首個字符串穗熬,所以把首個排除
        while (strs[i].indexOf(prefix) != 0) {
            // 如果后面的字符串不是以 prefix 開頭的,就減小 prefix 的長度
            prefix = prefix.substring(0, prefix.length() - 1);
            // 如果最后沒有公共字符串丁溅,返回 ""
            if (prefix.isEmpty()) return "";
        }        
    return prefix;
}

解題思路 1:
出最短的那個字符串的長度minLen死陆,然后在0...minLen的范圍比較所有字符串,如果比較到有不同的字符,那么直接返回當(dāng)前索引長度的字符串即可措译,否則最后返回最短的字符串即可别凤。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        int len = strs.length;
        if (len == 0) return "";
        int minLen = 0x7fffffff; // 0x7FFFFFFF 是long int的最大值
        for (String str : strs) minLen = Math.min(minLen, str.length());
        for (int j = 0; j < minLen; ++j)
            for (int i = 1; i < len; ++i)
                if (strs[0].charAt(j) != strs[i].charAt(j))
                    return strs[0].substring(0, j);
        return strs[0].substring(0, minLen);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市领虹,隨后出現(xiàn)的幾起案子规哪,更是在濱河造成了極大的恐慌,老刑警劉巖塌衰,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诉稍,死亡現(xiàn)場離奇詭異,居然都是意外死亡最疆,警方通過查閱死者的電腦和手機杯巨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來努酸,“玉大人服爷,你說我怎么就攤上這事』裾” “怎么了仍源?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長舔涎。 經(jīng)常有香客問我笼踩,道長,這世上最難降的妖魔是什么亡嫌? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任嚎于,我火速辦了婚禮,結(jié)果婚禮上挟冠,老公的妹妹穿的比我還像新娘于购。我一直安慰自己,他們只是感情好圃郊,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著女蜈,像睡著了一般持舆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伪窖,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天逸寓,我揣著相機與錄音,去河邊找鬼覆山。 笑死竹伸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勋篓,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼吧享,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了譬嚣?” 一聲冷哼從身側(cè)響起钢颂,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拜银,沒想到半個月后殊鞭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡尼桶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年操灿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泵督。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡趾盐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幌蚊,到底是詐尸還是另有隱情谤碳,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布溢豆,位于F島的核電站蜒简,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏漩仙。R本人自食惡果不足惜搓茬,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望队他。 院中可真熱鬧卷仑,春花似錦、人聲如沸麸折。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垢啼。三九已至窜锯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芭析,已是汗流浹背锚扎。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馁启,地道東北人驾孔。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親翠勉。 傳聞我的和親對象是個殘疾皇子妖啥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容