算法题每日一练---第100天:消失的数字+左旋转字符串

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

消失的数字

一、问题描述

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

题目链接:消失的数字

二、题目要求

样例 1

输入: nums = [4,3,2,7,8,2,3,1]
输出: [5,6]
复制代码

样例 2

输入: nums = [1,1]
输出: [2]
复制代码

考察

1.哈希表、简单模拟
2.建议用时10~25min
复制代码

三、问题分析

这一题和有异曲同工之妙,我再来讲解一波:

22.png

消失的数字,我们只需要遍历判断1~n这些数字是否在数组里面出现过,那如何判断?

这就应用到我们的哈希表了,一开始先记录每个元素出现的次数,这里我们只需要判断这个元素是否出现就行,不需要++,当时我优化了整整30ms。

这波分析,问题基本拿捏!

23.png

四、编码实现

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        vector<int>v;
        map<int,int>m;
        int i,j,n=nums.size();//初始化数据
        for(i=0;i<n;i++)//哈希计数
            m[nums[i]]=1;
        for(i=1;i<=n;i++)//遍历判断
        {
            if(m[i]==0)
                v.push_back(i);
        }
        return v;//输出结果
    }
};
复制代码

五、测试结果

2.png

1.png

左旋转字符串

一、问题描述

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。

请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"

题目链接:左旋转字符串

二、题目要求

样例 1

输入: s = "abcdefg", n = 2
输出: "cdefgab"
复制代码

样例 2

输入: s = "lrloseumgh", n = 6
输出: "umghlrlose"
复制代码

考察

1.字符串
2.建议用时10~25min
复制代码

三、问题分析

27.png

左旋字符串,做了这题岂不是要瘦死。

这一题主要还是考察字符串的应用,我们主要有两种考虑方法。

第一种,我们可以直接拼接原有的字符串形成一个新的字符串。

但是这一题如果不让申请额外的空间,只能在原串操作的话,就不能用第一种了。

第二种,我们可以对字符串进行三次翻转操作:

1.翻转前面的子串
2.翻转后面的子串
3.翻转整个字符串
复制代码

四、编码实现

1.法一

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        if(n==0) return s;
        return s.substr(n,s.size()-n)+s.substr(0,n);
    }
};
复制代码

2.法二

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s.begin(),s.begin()+n);
        reverse(s.begin()+n,s.end());
        reverse(s.begin(),s.end());
        return s;
    }
};
复制代码

五、测试结果

1.png

2.png

法二内存消耗少了一点

猜你喜欢

转载自juejin.im/post/7101653427146457102