剑指Offer刷题系列1--数组,字符串

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

解决思路:
(1)原始解法,从左到右,从上到下依次比较,直到找到该整数或者全部比较完。
(2)优化解法:利用数组的有序递增特点,从左下角开始比较,比数大,右移;比数小,上移(直接跳过一行),直到找到该数,越界则表示整数不在数组中。

原始解法代码C++:

class Solution {
public:
    bool Find(int target, vector > array) {
        int m = array.size();
        int n= array[0].size();
         
        int i,j;
        for(i=0;i

优化解法代码C++:

class Solution {
public:
    bool Find(int target, vector > array) {
        int m = array.size();
        int n= array[0].size();
        
        int i,j;
        i = m-1;
        j=0;
        while(i>=0&&i=0&&j

题目描述
2、请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

解题思路:
(1)直接利用JAVA或者其他函数自带的函数库完成替换
(2)分析字符串,先从前往后遍历统计空格个数,再从后往前替换。注意点:替换后的字符总数应当<=length长度,最后一位应为’\0’

解法1代码(JAVA):

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	return str.toString().replaceAll(" " , "%20");
    }
}

解法2代码(C++):

class Solution {
public:
    void replaceSpace(char *str,int length) {
        int i=0,j=0,count=0;
        int newlen=0,oldlen = 0;
         
        while(str[i]!='\0'){
            if(str[i]==' ')
            {
                count++;//先统计空格个数
            }
            else
                oldlen++;//统计非空格字母个数
            i++;
        }
        newlen=oldlen+count*3;//替换后字符串总长度
        oldlen +=count;//原字符串有效字母加空格总长度
        if(newlen>length)//替换后总长度小于字符串数组长度,不符合
            return;
            //注意结尾有个'\0',因此不需要从oldlen-1开始
        while(newlen>=0){
            if(str[oldlen]==' '){//字符为空格时:从后往前替换
                str[newlen--]='0';
                str[newlen--]='2';
                str[newlen--]='%';
                oldlen--;//前移
            }
            else{
                str[newlen--]=str[oldlen--];
            }        
        }            
    }
};

你可能感兴趣的:(剑指Offer)