①二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
链接: 点击打开链接
思路:刚开始想按行遍历,每行二分,这样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--; } } } };