【力扣】刷題,手寫Java算法,每日一題,持續更新...

小編現在很迷戀刷算法題,就像當初迷戀做數獨遊戲一樣,有種回到高中做數學題的感覺,很爽。

本篇,主要是把自己發表過的算法題做一個總結,一篇概括,所以會持續更新,敬請期待!

不要在意標題啦,主要是爲了更醒目一些,可以增加訪問量嘛 。~~(*^▽^*) ~~

一、簡單:

題1. 給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉,

如:輸入: 123,輸出: 321;輸入: -123,輸出: -321;輸入: 110,輸出: 11;

注意:假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231,  231 − 1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0。

解題思路:運算符最優原則,使用取餘的方式去反轉,對溢出的情況做異常判斷,直接返回0。

代碼:

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

題2. 實現函數 ToLowerCase()功能,將該字符串中的大寫字母轉換成小寫字母,之後返回新的字符串。

如:輸入: “Hello world”,輸出: “hello world” ;

解題思路:用位運算的技巧,ASCII碼錶中大寫的A是65,小寫的a是97,它們的差是32。所以,有 65 | 32 轉爲二進制(按8位來算)可以得到 0100 0001 | 0010 0000 = 0110 0001 = 97 = a;

代碼:

class Solution {
    public String toLowerCase(String str) {
        if (str == null && "".equals(str)) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        for(char i : str.toCharArray()){
            sb.append(i |= 32);
        }
        return sb.toString();
    }
}

擴展:

①. 大寫變小寫、小寫變大寫:字符 ^= 32;

②. 大寫變小寫、小寫變小寫:字符 |= 32;

③. 小寫變大寫、大寫變大寫:字符 &= -33;

題3. 給定一個整數數組 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) {
        int[] indexs = new int[2];
        for(int i = 0; i < nums.length; i++){
             for(int j = nums.length - 1; j > i; j --){
                 if(nums[i] + nums[j] == target){
                    indexs[0] = i;
                    indexs[1] = j; 
                    return indexs;
                }
            }
        }
        return indexs;
    }
}

題4. 顛倒給定的 32 位無符號整數的二進制位。

 如:輸入: 00000010100101000001111010011100,輸出: 00111001011110000010100101000000

解釋: 輸入的二進制串 00000010100101000001111010011100 表示無符號整數 43261596,因此返回 964176192,其二進制表示形式爲 00111001011110000010100101000000。

解題思路:直接使用Integer包裝類的 reverse(n) 方法,底層實現可以去看源碼,同樣是運算符最優原則。

代碼:

public class Solution {
    public int reverseBits(int n) {
        return Integer.reverse(n);
    }
}

二、中等:

題1. 給定一個單詞,你需要判斷單詞的大寫使用是否正確。滿足全部大寫、全部小寫、首字母大寫返回true,否則返回false

 如:輸入: “JIMMY”,輸出: true;輸入: “jimmy”,輸出: true;輸入: “Jimmy”,輸出: true;輸入: “JimmY”,輸出: false;

解題思路:Java只有轉大寫和轉小寫,並沒有像Python的title()方法,所以我們定義了一個正則表達式,速度還可以。

class Solution {
    public boolean detectCapitalUse(String word) {
        if(word.equals(word.toUpperCase())){
            return true;
        }
        if(word.equals(word.toLowerCase())){
            return true;
        } 
        return word.matches("^[A-Z]{1}[a-z]{0,}");
    }
}

三、困難:

 

少俠請留步 ... ヾ(◍°∇°◍)ノ゙ ... 
歡迎點贊、評論、加關注,讓更多人看到學到賺到
更多精彩,請關注我的"今日頭條號":Java雲筆記

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章