1.在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
法一:从左下角开始;大于目标值则向上走,小于目标值则向右走;
public boolean Find(int target, int [][] array) {
int rowCount=array.length;
int colCount=array[0].length;
for(int i=0,j=colCount-1;i<rowCount&&j>=0;){
if(target==array[i][j]) return true;
else if(target<array[i][j]){j--;}
else {i++;}
}
return false;
}
法二:每一行都是一组有序数组,采用二分查找法,一行一行的找
public boolean Find(int target, int [][] array) {
int rowCount=array.length;
int colCount=array[0].length;
int mid;
for(int i=0;i<rowCount;i++){
int high=colCount-1;
int low=0;
while(low<=high){
mid=(high+low)/2;
if(array[i][mid]==target) return true;
else if(target>array[i][mid]) low=mid+1;
else high=mid-1;
}
}
return false;
法三:从右上角开始;若大于目标值向左走,若小于目标值向右走;
2.请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
public class Solution {
/*
*思路:若正向替代,会导致频繁移动字符, 效率低下; 所以,从后面向前替代.
先计算出所需长度,防止长度不够用;
从后向前遍历,若为空格,替换为%20;否则,设置为之前的字符
*/
public String replaceSpace(StringBuffer str) {
int spaceNum=0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)==' ') spaceNum++;
}
if(spaceNum==0) return str.toString();
int oldIndex=str.length()-1;
int newIndex=oldIndex+spaceNum*2;
str.setLength(newIndex+1);
for(;oldIndex>=0;oldIndex--){
if(str.charAt(oldIndex)==' '){
str.setCharAt(newIndex--,'0');
str.setCharAt(newIndex--,'2');
str.setCharAt(newIndex--,'%');
}else{
str.setCharAt(newIndex--,str.charAt(oldIndex));
}
}
return str.toString();
}