昨天早上電面了愛奇藝的開發測試,我覺得愛奇藝不重視技術,愛奇藝的覺得我業務不太一致,互相應付草草了事。
事后想想這樣不太好,做事還是要認認真真,不能隨意應付。
第三題:
在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
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();
}