小編現在很迷戀刷算法題,就像當初迷戀做數獨遊戲一樣,有種回到高中做數學題的感覺,很爽。
本篇,主要是把自己發表過的算法題做一個總結,一篇概括,所以會持續更新,敬請期待!
不要在意標題啦,主要是爲了更醒目一些,可以增加訪問量嘛 。~~(*^▽^*) ~~
一、簡單:
題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雲筆記