算法题面试实战收集

  1. 回文数字 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这样来反转数字。所以这是这道算法题希望考察到的点。

  1. 岛屿数量 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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值