小编现在很迷恋刷算法题,就像当初迷恋做数独游戏一样,有种回到高中做数学题的感觉,很爽。
本篇,主要是把自己发表过的算法题做一个总结,一篇概括,所以会持续更新,敬请期待!
不要在意标题啦,主要是为了更醒目一些,可以增加访问量嘛 。~~(*^▽^*) ~~
题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 (resInteger.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云笔记