牛客网剑指offer编程题--前十题

①二维数组中的查找

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

链接:   点击打开链接

思路:刚开始想按行遍历,每行二分,这样O(nlogn)时间复杂度应该能过,后来看了别人的思路才知道可以从右上角开始,每次target大了就往下走,小了往左走。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        int row = array.size();        //行数
        int col =  array[0].size();            //列数
        int i = 0;
        int j = col - 1;
        //从右上角开始搜索
        while(i < row && j >= 0){        //未越界
            if(target == array[i][j]) 
                return true;
            if(target < array[i][j])
                j--;
            else if(target > array[i][j])
                i++;
        }
        return false;
    }
};

②替换空格

链接 点击打开链接

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

思路:效率比较高的方法应该是不经过中间数组直接在原数组里替换(我刚开始用中间数组,结果段错误)。正确解法应该是对每个字符,偏移的字符数等于2乘以之前的空格数,所以先统计空格数,倒着从'\0'字符挨着走,遇到空格就替换。

class Solution {
public:
	void replaceSpace(char *str,int length) {
        int num = 0;            //空格个数
        for(int i = 0;i < length;i++){            //遍历字符串
            if(str[i] == ' ')
                num++;
        }
        int l,r;
        l = length;
        r = length + 2*num;
        while(l >= 0){
            if(str[l] != ' '){
                str[r] = str[l];
                l--,r--;
            }else{
                str[r-2] = '%';
                str[r-1] = '2';
                str[r] = '0';
                r -= 3,l--;
            }
        }
        
	}
};

猜你喜欢

转载自blog.csdn.net/lmhlmh_/article/details/80582023