《LeetCode零基础指南》雪国列车(第五天) 指针

0解题者1
算法领域新星创作者
2021-12-04 16:49:37
加精

目录

 

1470. 重新排列数组

1920. 基于排列构建数组

1480. 一维数组的动态和

剑指 Offer 58 - II. 左旋转字符串

1108. IP 地址无效化 

1365. 有多少小于当前数字的数字

剑指 Offer 17. 打印从1到最大的n位数​​​​​​​

1389. 按既定顺序创建目标数组


1470. 重新排列数组

1470. 重新排列数组

解法一:临时空间法

class Solution {
public:
    vector<int> shuffle(vector<int>& nums, int n) {
    vector<int>jie(2*n);
    for(int i=0;i<2*n;i+=2){
         jie[i+1]=nums[n+i/2];
         jie[i]=nums[i/2];
    }
    return jie;
    }
};

1929. 数组串联

1929. 数组串联

class Solution {
public:
    vector<int> getConcatenation(vector<int>& nums) {
    int n=nums.size();
    vector<int>jie(2*n);
    for(int i=0;i<n;i++){
        jie[i]=nums[i];
        jie[i+n]=nums[i];
    }
    return jie;
    }
};

或:

class Solution {
public:
    vector<int> getConcatenation(vector<int>& nums) {
    vector<int>jie(nums.begin(),nums.end());
    for(auto it:nums)jie.emplace_back(it);
    return jie;
    }
};

1920. 基于排列构建数组

1920. 基于排列构建数组

class Solution {
public:
    vector<int> buildArray(vector<int>& nums) {
    int n=nums.size();
    vector<int>jie(n);
    for(int i=0;i<n;i++)jie[i]=nums[nums[i]];
    return jie;
    }
};

1480. 一维数组的动态和

1480. 一维数组的动态和

//有兴趣的小伙伴可以顺便了解一下【前缀和】这种解题技巧

class Solution {  
public:
    vector<int> runningSum(vector<int>& nums) {
    int n=nums.size();
    vector<int>dp(n);
    dp[0]=nums[0];
    for(int i=1;i<n;i++)dp[i]=nums[i]+dp[i-1];
    return dp;
    }
};

剑指 Offer 58 - II. 左旋转字符串

剑指 Offer 58 - II. 左旋转字符串

//这道题可以帮助巩固很多字符串基操。

解法一:字符串的截取操作。

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        s += s;
        return s.substr(n,s.size()/2);  //从第n号位开始截取
    }
};

解法二:三次反转法

class Solution {//技巧性很强,稍作观察
public:
    string reverseLeftWords(string s, int n) {
    int len=s.size();
    reverse(s.begin(),s.end()-len+n);    
    reverse(s.begin()+n,s.end());
    reverse(s.begin(),s.end());
    return s;
    }
};

解法三:临时空间法

class Solution {
public:
    string reverseLeftWords(string s, int n) {
    string jie;
    for(int i=n;i<s.size();i++){
        jie.push_back(s[i]);
    }
    for(int i=0;i<n;i++){
        jie.push_back(s[i]);
    }
    return jie;
    }
};

解法四:拼接法//一行

class Solution {
public:
    string reverseLeftWords(string s, int n) {
    return s.substr(n,s.size()-n)+s.substr(0,n);
    }
};

解法五:指针法

class Solution {
public:
    string reverseLeftWords(string s, int n) {
    string jie="";
    for(int i=0;i<s.size();i++)jie+=s[(i+n)%s.size()];
    return jie;
    }
};

1108. IP 地址无效化 

1108. IP 地址无效化​​​​​​​

      //下面两题套用临时空间很容易秒掉,先不深入了

class Solution {
public:
    string defangIPaddr(string address) {
    string jie;
    for(char i:address){
        if(i=='.')jie+="[.]";
        else jie+=i;
    }
    return jie;
    }
};

剑指 Offer 05. 替换空格

剑指 Offer 05. 替换空格

class Solution {
public:
    string replaceSpace(string s) {
    string k="";                
    for(int i=0;i<s.size();i++){
     if(s[i]!=' ')k+=s[i];
     else k+="%20";
    }
    return k;  
    }
};

1365. 有多少小于当前数字的数字

1365. 有多少小于当前数字的数字

解法一:直观的BF;

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
    vector<int>jie;
    for(int i=0;i<nums.size();i++){
        int tmp=0;
        for(int j=0;j<nums.size();j++){
            if(j==i)continue;
            if(nums[i]>nums[j])tmp++;
        }
        jie.emplace_back(tmp);
    }
    return jie;
    }
};

解法二:前缀和解法

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
    vector<int>cnt(101,0);
    for(int i:nums)cnt[i]++;
    for(int i=1;i<101;i++)cnt[i]+=cnt[i-1];   //用前缀和计算小于i的元素个数
    vector<int>jie(nums.size());
    for(int i=0;i<nums.size();i++){
    if(nums[i]==0)jie[i]=0;
    else jie[i]=cnt[nums[i]-1];
    }
    return jie;
    }
};

 

剑指 Offer 17. 打印从1到最大的n位数

解法一:直接破】//如果n超过64字节怎么办,那就只能用大数算法了——(用数组模拟大数)

class Solution {
public:
    vector<int> printNumbers(int n) {
    vector<int>jie;
    for(int i=1;i<pow(10,n);i++)jie.push_back(i);
    return jie;
    }
};

解法二:补充一下内置函数

class Solution {
public:
    vector<int> printNumbers(int n) {
    vector<int>jie(pow(10,n)-1);
    iota(jie.begin(),jie.end(),1); //iota,包含在头文件numeric里面,会用连续的T类型值填充数组
    return jie;                    //效果,就如题目一般
    }
};

1389. 按既定顺序创建目标数组

class Solution {//C++,STL
public:
    vector<int> createTargetArray(vector<int>& nums, vector<int>& index) {
        vector<int>jie;
        for (int i = 0; i < nums.size(); ++i) {
            jie.insert(jie.begin() + index[i], nums[i]);
        }
        return jie;
    }
};

 

...全文
456 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,111

社区成员

发帖
与我相关
我的任务
社区描述
学习「 算法 」的捷径就是 「 题海战略 」,社区由「 夜深人静写算法 」作者创建,三年ACM经验,校集训队队长,亚洲区域赛金牌,世界总决赛选手。社区提供系统的训练,答疑解惑,面试经验,大厂内推等机会
社区管理员
  • 英雄哪里出来
  • 芝麻粒儿
  • Amy卜bo皮
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

QQ群:480072171

英雄算法交流 8 群

 

试试用AI创作助手写篇文章吧