百度视频面一面首先是一个简单的自我介绍,手边放了提前准备的发言稿,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