Int和String的互换(记百度视频面试经历)

        百度视频面一面首先是一个简单的自我介绍,手边放了提前准备的发言稿,bulabula说了一会,面试官小哥哥问了一下实习的经历(太水,都不愿意问,应该)然后就进入了coding环节。

第一个问题:Int转String

听到这个问题蛮高兴的,因为之前视频面试饿了么的时候正好做过,可惜没有好好总结。我选择了先些简单的,在逐步使用各种TestCase的方法。

最简单的

public int pasre(String s) {
        int sum = 0;
        for (int i = 0; i < s.length(); i++) {
            int temp = s.charAt(i) - '0';
            sum = sum * 10;
            sum += temp;
        }
        return sum;
    }
这个比较简单,很快就写出来了

接下来需要进行输入格式以及正负数的判断了

直接放正确的代码吧,我自己的错误的逻辑就不展示了,有点乱

怎么判断格式呢?

for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) < '1' || s.charAt(i) > '9') {
                System.out.println("输入格式错误");
                flag = false;
                break;
            }
        }
这样的话,符号位怎么判断呢?在小哥哥的提示下,我试图先判断符号位

如果第一位不符合,直接抛出异常

public int parseInt(String s){
        //是否是空
        if(s == null||s.equals("")){
            throw new NumberFormatException();
        }
        int result = 0;
        //符号位是'-'
        if(s.charAt(0)=='-'){
            if(format(s,1)){
                result =  -pasre(s,1);
            }
        }
        //符号位大于0,小于9
        else if(s.charAt(0)>=0&&s.charAt(0)<=9){
            if(format(s,0)){
                result =  pasre(s,0);
            }
        }else {
            throw new NumberFormatException();
        }

        return result;
    }

判断所有的位数是否符合格式要求蛮简单的,这里不赘述

if (s.charAt(0) == '-') {
            String subString = s.substring(1, s.length() - 1);
            sum = pasre(subString);
            return -sum;
        } else if(flag == true){
            sum = pasre(s);
        }
在视频写代码的过程中,如果能够出来正确的结果,我是十分高兴的,完全忽略了性能,这个时候小哥哥说,用substring耗费空间,有没有其他的解决办法,我一听,有点懵,最后在他的提示下,给出了答案,那就是解析的过程中,负数不传入符号位。

public int pasre(String s,int begin) {
        int sum = 0;
        for (int i = begin; i < s.length(); i++) {
            int temp = s.charAt(i) - '0';
            if(sum>(Integer.MAX_VALUE-temp)/10){
                throw new NumberFormatException();
            }else {
                sum = sum * 10;
                sum += temp;
            }
        }
        return sum;
    }

最后还有一个很重要的问题,就是如何处理溢出
public int pasre(String s,int begin) {
        int sum = 0;
        for (int i = begin; i < s.length(); i++) {
            int temp = s.charAt(i) - '0';
            if(sum*10+temp>Integer.MAX_VALUE){
                throw new NumberFormatException();
            }else {
                sum = sum * 10;
                sum += temp;
            }
        }
        return sum;
    }


这样写可以吗?最后在小哥哥的提示下,改成了这样的

public int pasre(String s,int begin) {
        int sum = 0;
        for (int i = begin; i < s.length(); i++) {
            int temp = s.charAt(i) - '0';
            if(sum>(Integer.MAX_VALUE-temp)/10){
                throw new NumberFormatException();
            }else {
                sum = sum * 10;
                sum += temp;
            }
        }
        return sum;
    }

修改后的代码是这样的。感兴趣的朋友可以想想为什么。


在面试结束的时候,主动问了一些面试建议。

第一:自我介绍的时候,在项目中药重点介绍自己做了什么,而不是整个团队做了什么,人家不care这个

第二:手写代码的过程可以展现求职者的code style,逻辑是否清晰,编程功底是否扎实


很快,就被告知一面没过,what  a pity


第二个问题:Int转String

第一个问题结束时,时间已经到了,侧面反映我真的蛮水,说本来还有个题目的,int转String,让我自己考虑考虑
看了JAVA源码,不是很明白,自己简单的实现了以下:
public class ParseIntToString {

    final static int[] sizeTable = {9, 99, 999, 9999, 99999, 999999, 9999999,
            99999999, 999999999, Integer.MAX_VALUE};

    //final static char [] intToChar = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

    // Requires positive x

    @Test
    public void Test() {
        System.out.println(parseIntToString(5468978));
        System.out.println(parseIntToString(-4587));
    }

    public String judge(int num) {
        if (num < 0) {
            String s = parseIntToString(-num);
            StringBuffer result = new StringBuffer("-");
            return result.append(s).toString();
        } else {
            return parseIntToString(num);
        }
    }

    static int stringSize(int x) {
        for (int i = 0; ; i++)
            if (x <= sizeTable[i])
                return i + 1;
    }

    public String parseIntToString(int num) {
        int a = 10;
        int b = 1;
        if (num >= 0) {
            int size = stringSize(num);
            char[] buf = new char[size];

            for (int i = size - 1; i >= 0; i--) {
                buf[i] = (char) (num / b % a + '0');
                b *= 10;
            }
            return new String(buf);
        } else {
            num = -num;
            int size = stringSize(num) + 1;
            char[] buf = new char[size];
            for (int i = size - 1; i > 0; i--) {
                buf[i] = (char) (num / b % a + '0');
                b *= 10;
            }
            buf[0] = '-';
            return new String(buf);
        }
    }

}

一个要点:
1、如何计算int的位数
2、如何求出每一位,并转成char
3、利用char数组构造String



相关的代码,我放在了GitHub上,有兴趣的读者,可以访问https://github.com/zhaocheng12/String-Int

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值