昨天早上电面了爱奇艺的开发测试,我觉得爱奇艺不重视技术,爱奇艺的觉得我业务不太一致,互相应付草草了事。
事后想想这样不太好,做事还是要认认真真,不能随意应付。
第三题:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
Consider the following matrix:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
Given target = 5, return true.
Given target = 20, return false.
解题思路是从右上角开始查找,以target16为例子,差右上角是15,如果比当前数据小,往下一行查找,19,回退一列找到12,16比12大,那么继续往下一行找到了16,中间发现测试数据没找到,对比后发现居然是数据源写错了,回想昨天调试脚本,查了半天发现测试床不对,修改后依然不通,傻眼的时候发现测试床打开了两个,修改成另一个测试床了,所以bug会以你想不到的事情存在……
package com.lyc.dataautest;
public class Findint {
public static boolean find(int target,int[][] arr) {
if(arr == null || arr.length == 0 || arr[0].length == 0) return false;
int r= 0;
int c = arr[0].length-1;
while(r<=arr.length-1 && c >=0) {
System.out.println("r is:"+r);
System.out.println("c is:"+c);
System.out.println("arr is:"+arr[r][c]);
if(target == arr[r][c]) {
System.out.println("target is:"+arr[r][c]);
return true;
}
else if(target>arr[r][c]) {
r++;
}
else {
c--;
}
}
return false;
}
public static void main(String[] args) {
int[][] arr = {{1,4,7,11,15},{2,5,8,12,19},{3,6,9,16,22},{10,13,14,17,24}};
System.out.println("target is2:"+arr.length);
find(16,arr);
}
}
第四题
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为 We Are Happy. 则经过替换之后的字符串为 We%20Are%20Happy。
思路:
在字符串尾部填充任意字符,使得字符串的长度等于字符串替换之后的长度。因为一个空格要替换成三个字符(%20),因此当遍历到一个空格时,需要在尾部填充两个任意字符。比如cc,即 we are happy变成we are happycccc
令 P1 指向字符串原来的末尾位置,P2 指向字符串现在的末尾位置。P1 和 P2 从后向前遍历,如果P1指向的不是空格,那么P2指向就填充成P1指向的值;当 P1 遍历到一个空格时,就需要令 P2 指向的位置依次填充 02%(注意是逆序的);
具体变化如下:
we are happy
we are happycccc
P1指向非空格,此时填充字符
we are happyappy
遇到空格P2指向分别填充02%()注意是逆序的)
we are h%20happy --此时P1指向空格,P2指向%,继续
we areare%20happy--继续填充
we%20are%20happy
具体实现上注意有个Stringbuffer与String的区别,查看资料如下,显然解释的不够清楚,百度不行啊,明天厂里google查一下:
(1) String类
该类一旦产生一个字符串,其对象就不可变。String类的内容和长度是固定的。如果程序需要获得字符串的信息需要调用系统提供的各种字符串操作方法实现。虽然通过各种系统方法可以对字符串施加操作,但这并不改变对象实例本身,而是生成一个新的实例。系统为String类对象分配内存,是按照对象所包含的实际字符数分配的。
(2) StringBuffer类
查了查Buffer这个词,有缓冲的意思,这个类肯定有缓冲的功能。该类处理可变的字符串。如果要修改一个StringBuffer类的字符串,不需要再创建新的字符串对象,而是直接操作原来的串。该类的各种字符串操作方法与String类提供的方法不相同。系统为StringBuffer类分配内存时,除去当前字符所占的空间外,还提供另外的16个字符大小的缓冲区。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。
public static String replace(StringBuffer str) {int oldindex = str.length()-1;for(int i=0;i=0 && newindex>=oldindex) {
char c = str.charAt(oldindex--);
if(c==' ') {
str.setCharAt(newindex--, '0');
str.setCharAt(newindex--, '2');
str.setCharAt(newindex--, '%');
} else {
str.setCharAt(newindex--, c);
}
}
System.out.println("value is:"+str.toString());
return str.toString();
}