算法:小技巧篇(待完善)
一、判断反转后或字符串加减法后的数字是否超过32有符号整数的范围
if (rev < INT_MIN / 10 || rev > INT_MAX / 10) { // 业务逻辑 }
1.1 整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [,
] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。输入:x = 123
输出:321
class Solution { public int reverse(int x) { int res = 0; System.out.println(Integer.MAX_VALUE); while(x != 0){ res = res * 10 + x%10; if(res > Integer.MAX_VALUE/10 || res < Integer.MIN_VALUE/10) // 重点 return 0; x = x/10; } return res; } }
二.进制转换
2.1 十进制转二进制
十进制整数转换为二进制整数十进制整数转换为二进制整数采用"除2取余,逆序排列"法。
具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
2.2 26进制转换
2.2.1 Excel表列名称
思路:
对于一般性的进制转换题目,只需要不断地对需要转换的数进行 % 运算取得最后一位,然后对该数进行 / 运算,将已经取得的位数去掉,直到 需要转换的数为 00 即可。
一般性的进制转换题目无须进行额外操作,是因为我们是在「每一位数值范围在 [0,x)」的前提下进行「逢 x 进一」。
但本题需要我们将从 1 开始,因此在执行「进制转换」操作前,我们需要先对 columnNumber 执行减一操作,从而实现整体偏移。
class Solution { public String convertToTitle(int cn) { StringBuilder sb = new StringBuilder(); while (cn > 0) { cn--; sb.append((char)(cn % 26 + 'A')); cn /= 26; } sb.reverse(); return sb.toString(); } }
三、荷兰国旗问题
3.1 颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
class Solution { // 荷兰国旗问题 public void sortColors(int[] nums) { int k=0, j=nums.length-1; int n = nums.length; for(int i=0; i<=j; i++){ while(i<j && nums[i] == 2){ int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; j--; } if(nums[i] == 0){ int tmp = nums[i]; nums[i] = nums[k]; nums[k] = tmp; k++; } } } }