剑指offer刷题总结

剑指offer刷题总结

1.二维数组的查找

1. 题目

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

2. 思路
利用二维数组由上到下,由左到右递增的规律,那么选取右上角或者左下角的元素a[row][col]与target进行比较,当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,即col–;当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,即row++;直到找到target与a[row][col]相等时返回true;若遍历完所有的均没有查找到,则返回false。

3. 代码

public class Solution {
    public boolean Find(int target, int [][] array) {
        int row=0;
        int col=array[0].length-1;
        while(row<=array.length-1&&col>=0){
            if(target==array[row][col])
                return true;
            else if(target>array[row][col])
                row++;
            else
                col--;
        }
        return false;
  
    }
}

4. 知识总结
(1)得到一个二维数组的列数的方法:int col=array[0].length
(2)得到一个二维数组的行数的方法:int col=array.length

2.替换空格

1. 题目
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
2. 思路
两种思路:
(1)从后往前记录
首先统计出含有的空格数,通过str.charAt(i)==’ '的方法转化为字符与空字符进行对比,统计出空格个数spacenum;
再计算出替换前的str下标indexOld和采用%20替换后的str下标indexNew;
对原字符串进行扩容至新字字符串大小;
从后往前遍历原字符串,当为空字符时则用%20进行替代,不是则复制原字符串位置元素;
最后将其转化为字符串进行返回。
本方法在事前已经获得改变后的字符串大小 ,所有元素只需要移动一次,效率相对高效。
(2)从前往后记录
新开辟一个StringBuffer,循环遍历字符串在i位置的字符所对应的字符串形式与空字符串是否相同,相同则进行替换out.append("%20");最后将其变成字符串形式 out.toString()。
该方法每次进行变换时,字符串中每个字符位置都将进行移动,效率将比第一种方法低。

3. 代码
从后往前记录

public class Solution {
    public String replaceSpace(StringBuffer str) {
        int spacenum = 0;//spacenum为计算空格数
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)==' ')
                spacenum++;
        }
        int indexold = str.length()-1; //indexold为为替换前的str下标
        int newlength = str.length() + spacenum*2;//计算空格转换成%20之后的str长度
        int indexnew = newlength-1;//indexold为为把空格替换为%20后的str下标
        str.setLength(newlength);//使str的长度扩大到转换成%20之后的长度,防止下标越界
        for(;indexold>=0 && indexold<newlength;--indexold){
                if(str.charAt(indexold) == ' '){  //
                str.setCharAt(indexnew--, '0');
                str.setCharAt(indexnew--, '2');
                str.setCharAt(indexnew--, '%');
                }else{
                    str.setCharAt(indexnew--, str.charAt(indexold));
                }
        }
        return str.toString();
    }
}

从前往后记录

public class Solution {
    public String replaceSpace(StringBuffer str){
        StringBuffer out=new StringBuffer();
        for(int i=0;i<str.toString().length();i++){
                char b=str.charAt(i);
                if(String.valueOf(b).equals(" ")){
                        out.append("%20");
                }else{
                        out.append(b);
                }
        }
            return out.toString();
    }
}

5. 知识总结
(1)得到字符串在i位置的字符,方法为str.charAt(i)
(2)StringBuffer具有动态扩展str.setLength(newlength) 方法、更换某某一位置字符str.setCharAt(indexnew–, ‘0’) 方法、添加内容out.append(b) 方法。在对字符串执行字符变更(替换、添加操作时可以考虑StringBuffer类);
(3)在对字符串进行变更操作时可以采用将其变换成字符str.charAt(i) 进行操作(类似数组的操作),也可以将棋直接在字符串进行替换操作String.valueOf(b).equals(" ")
https://www.nowcoder.com/profile/220316641/codeBookDetail?submissionId=44600861

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值