[剑指offer]03. 数组中重复的数字,04. 二维数组中的查找,05. 替换空格


1.数组中重复的数字

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
在这里插入图片描述

解题思路:

以[2,3,1,0,4,5,3]为例,数组第0个数字为2,将2与数组第2个位置的数字交换。交换之后的数组[1,3,2,0,4,5,3]第0个元素为1,继续将1与数组中第一个数字交换,交换后的数组为 [3,1,2,0,4,5,3],继续交换直到第一个位置的数字为0。此时数组为 [0,1,2,3,2,5,3],数组0,1,2,3位置的数字为0,1,2,3,继续往后扫描第4个位置的数字为2,与第二个位置的数字相同,因此找到了一个重复的数字。该题解答。

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        int len=nums.size();
        for (int i = 0; i < len; i++)
	    {
		    while (nums[i] != i)
		    {
			    if (nums[nums[i]]!=nums[i])
			    {
				    swap(nums[nums[i]], nums[i]);
			    }
			    else
			    {
				    return nums[i];
			    }
		    }
	    } 
        return false;
    }
};

2. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
在这里插入图片描述

解题思路:

以上边的矩阵为例,target=5,从左下角元素开始查找,即从行row=4,列column=0开始查找。如果左下角元素大于target,则column++,如果左下角元素小于target,则row–,如果左下角元素等于target,则返回true。如果遍历完整个矩阵依然没有找到target,则返回false。

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        int row=matrix.size()-1,column=0;
        while(row>=0&&column<matrix[0].size())
        {
            if(matrix[row][column]==target)
            {
                return true;
            }
            else if(matrix[row][column]>target)
            {
                row--;
            }
            else
            {
                column++;
            }
        }
        return false;
    }
};

3.替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
在这里插入图片描述

解答思路

遍历字符串s,当字符串元素为空的时候则分别push_back %,2,0。不为空时push_back该字符串。返回新建字符串。

class Solution {
public:
    string replaceSpace(string s) {
        string array;
        for(auto e:s)
        {
            if(e==' ')
            {
                array.push_back('%');
                array.push_back('2');
                array.push_back('0');
            }
            else
            {
                array.push_back(e);
            }
        }
        return array;
    }
};

总结

总结剑指offer第二版的题目,明天加油。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值