- 回文数字 2023-08-18 美团 一面
在不使用额外的内存空间的条件下判断一个整数是否是回文。
回文指逆序和正序完全相同。
数据范围:
进阶: 空间复杂度O(1) ,时间复杂度 O(n)
提示:
负整数可以是回文吗?(比如-1)
如果你在考虑将数字转化为字符串的话,请注意一下不能使用额外空间的限制
你可以将整数翻转。但是,如果你做过题目“反转数字”,你会知道将整数翻转可能会出现溢出的情况,你怎么处理这个问题?
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param x int整型
* @return bool布尔型
*/
//1. 负整数在这道题里不算是回文,比如-121!=121-
//方案一:121%10=1,121/100=1
public boolean isPalindrome (int x) {
// if (x<0) return false;
// String str = x + "";
// int len = str.length();
// if (len==1){
// return true;
// }
// int mid = len/2;
// int p=0;
// for (int i=1;i<=mid;i++){
// int temp = x%10;
// System.out.println("temp="+temp);
// p=p*10 + temp;
// x = x/10;
// }
// if (x == p){
// return true;
// }
// return false;
int y = 0;
int a = x;
while (a>0){
y = y * 10 + (a%10);
a = a/10;
}
return y == x;
}
}
上面的被注释的代码才是本人所写,当然,一开始说需要O(logn)的时间复杂度,所以想到要二分,求得了x的位数长度。然后是判断负数是否是回文,题目认为不是,所以有了判断为负就直接返回false;所以整体写的略微复杂了。后面的结果是面试官给出的答案,是比较美观、简洁的代码,思路很清晰。
当然,这道题其实有几个特点:首先他不是回文字符串,而是数字,数字类问题意味着我们可以做加减乘除、位运算等,也就是说我们没必要转成字符串然后判断回文,可以利用数字的特性通过多次取模乘10这样来反转数字。所以这是这道算法题希望考察到的点。
- 岛屿数量 2023-08-28 能链二面 补充并查集解法
给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。
例如:
输入
[
[1,1,0,0,0],
[0,1,0,1,1],
[0,0,0,1,1],
[0,0,0,0,0],
[0,0,1,1,1]
]
对应的输出为3。
并查集可以解决岛屿问题,因为不熟,所以面试过程中没有使用,但是如果可以写出来,无疑对自己是一个加分项。
//方案一:遍历,找到某个1后可以扩展它的上下左右格子,使用深度优先搜索或者宽度优先搜索,并使用set集保存已经统计过的为1的格子。其中递归+深度优先搜索的方式代码比较简单,面试过程中也是写的这个方案,并且可以快速测试通过。
//方案二:并查集,所有为1的格子都跟历史的已生成岛屿
3.美团一面
实现一个方法,string入参转出参,遇到错误返回0,超出最大范围返回MaxValue,会有负数。
private static int parseInt(String str) {
if (str == null) {
return 0;
}
//抹掉空格
str = str.trim();
int len = str.length();
if (len==0){
return 0;
}
long rst =0;
boolean ifFuShu = false;
for (int i=0;i<len;i++){
char c = str.charAt(i);
if (c == '-') {
if (i==0){
ifFuShu = true;
} else {
return 0;
}
} else {
//需要判断是否是数字
if (Character.isDigit(c)){
long l = c-'0';
rst = rst*10 + l;
} else {
return 0;
}
}
}
if (ifFuShu) {
rst = -rst;
}
if (rst > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
if (rst < Integer.MIN_VALUE){
return Integer.MIN_VALUE;
}
return (int)rst;
}