记录自己在剑指offer刷题经验,坚持每天做几题理理思路学学算法的思想,其实啥都不会,看刷一遍能不能开拓一下先
1)二维数组中查找目标值
思路是:从二维数组的右上角或者左下角开始寻找,比如右上角开始,若值比target大;则这一列的值都将大于target所以cols-1;
若值比target小则rows+1向下一行继续收索;代码如下
考点:
1)数组的行列值 int col=array[0].length-1;
2)判断位置语句 if(array[row][col]>target){
col--;
}else{
row++; }
public class Solution {
public boolean Find(int target, int [][] array) {
if(array==null){
return false;
}
int row=0;
int col=array[0].length-1; %列值
while(row<array.length&&col>=0){
if(array[row][col]==target){
return true;
}
if(array[row][col]>target){ %大于目标值,删除这一列,左挪一列
col--;
}else{
row++; %小于目标值,删除这一行,下挪一行
}
}
return false;
}
}
2)替换字符串中的空格
思路是:先计算出原始字符串有多少个空格banknum,则新字符串newlength=len+2*banknum;从原str中最后一位还是判断是否为空格,是的话在新数组char末尾开始设值为newchars[index--]='0';newchars[index--]='2'; newchars[index--]='%';否则将原值复制到新数组中。记住index是一直自减的。
考点:
1)字符串给数组的赋值 newchars[index--]=str.charAt(i);
2)数组转换成字符串进行返回 return new String(newchars);
public class Solution {
public String replaceSpace(StringBuffer str) {
if(str==null){
return null;
}
int banknum=0;
int len=str.length();
int newlen=0;
for(int i=0;i<len;i++){
if(str.charAt(i)==' '){
banknum++; %判断空格有多少个
}
}
newlen=len+2*banknum; %新数组的长度
char[] newchars=new char[newlen]; %创建长度为newlen的数组
int index=newlen-1;
for(int i=len-1;i>=0;i--){ %从原str最后一位开始判断是否为''
if(str.charAt(i)==' '){
newchars[index--]='0'; %新数组从末尾开始补充
newchars[index--]='2';
newchars[index--]='%';
}
else{
newchars[index--]=str.charAt(i);
}
}
return new String(newchars); %返回新字符串
}
}
法二更简单,直接String.append就好了
考点:append用法
if(String.valueOf(str.charAt(i)).equals(" ")){
sb.append("%20");}
public class Solution {
public String replaceSpace(StringBuffer str) {
StringBuilder sb=new StringBuilder();
if(str==null){
return null;
}
for(int i=0;i<str.length();i++){
if(String.valueOf(str.charAt(i)).equals(" ")){ %判断字符串i是否为空格
sb.append("%20");
}else{
sb.append(str.charAt(i));
}
}
return String.valueOf(sb);
}
}