手写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云笔记
随时随地,让你拥有最新,最便捷的掌上云服务

发布了147 篇原创文章 · 获赞 169 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_44259720/article/details/103292427