2021-11-24 剑指offer03.数组中重复的数字05.替换空格

写在前面的碎碎念:电脑坏了一周以后的终于回归,可以继续更新啦(ps.老综联想真是又贵又慢呀)因此这一周的Java停滞,lc停滞。。。仅把剑指offer粗读了一遍,之后一周应该会把剑指offer1刷完;计网学的也差不多了,其他课粗看了些,没啥头绪。

2021-11-24始 剑指offer二刷~记录有价值的题

剑指 Offer 03. 数组中重复的数字

找出数组中重复的数字。

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

示例 1:

输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3

  1. 排序法
    时间O(log n)

  2. 哈希表

  3. 书上的空间优先解法
    不断交换,直到发现重复的数字。时间复杂度O(n) 空间O(1)

注意:做题之前先要判别好无效输入测试用例,本题中,排除数组为0的情况,输入空指针,长度为n的数组中输入了0-n-1以外的数字都要先排除掉!!!

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        int n=nums.size();
        if(n==0) return false;

        for(int i=0;i<n;i++)
        {
            if(nums[i]<0||nums[i]>n-1)
            {
                return false;
            }
        }
        for(int i=0;i<n;i++)
        {
            if(nums[i]!=i)
            {
                if(nums[nums[i]]==nums[i]) return nums[i];
                swap(nums[i],nums[nums[i]]);
            }

        }
        return -1;
    }
};

剑指 Offer 03. 数组中重复的数字(不修改数组找出重复的数字)

长度为n+1的数组里所有数字都在1-n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。

二分的思想。
我们把1-n的数字从中间的数字m分成两部分
前面一半1-m,后面一半m+1-n
如果1-m的数字的数目超过m,那么这一半的区间里一定包含重复数字;否则重复的数字包含在另一半里;可以不断一分为二,直到找到一个重复的数字

时间O(nlogn)但数组本身完全没有变,以时间换空间

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

不用库函数replace…
先把数组扩容,双指针,一个指针指数组尾部,一个指针指原来的字符串,从尾部扫到头部,遇到空格就插入“%20”,否则就插入原字符。

学习点:倒序遍历解决问题;双指针

class Solution {
public:
    string replaceSpace(string s) {
        int space=0;
        int len=s.length();
        for(int i=0;i<len;i++)
        {
            if(s[i]==' ') space++;
        }

        s.resize(len+space*2);

        int newp=len+space*2-1;
        int oldp=len-1;
        for(int i=oldp;i>=0;i--)
        {
            if(s[i]!=' ') s[newp--]=s[i];
            else
            {
                s[newp--]='0';
                s[newp--]='2';
                s[newp--]='%';
            }
        }

        return s;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值