[学习报告]《LeetCode零基础指南》(第四讲) 指针

YUAN_798 2022-01-15 20:16:22

一、今日知识点总结

1. 学习了指针的概念、如何定义指针、取地址、解引用等

2. 熟悉了vector相关操作

二、今日做题记录

 

 

 

1470. 重新排列数组

法一:

空间换时间,将数组nums中的前n个元素即x1~xn取出暂存到数组temp中,然后按照规则将重新填入到nums数组中。

class Solution {
public:
    vector<int> shuffle(vector<int>& nums, int n) {
        //定义temp中的前n个元素为nums中的前n个元素
        vector<int> temp(nums.begin(),nums.begin()+n);
        
        for(int i = 0; i < 2 * n; i+=2){
            nums[i] = temp[i / 2];
            nums[i + 1] = nums[i / 2 + n];
        }
        return nums;
    }
};


法二:

空间换时间,思想与法一类似,实现方法略有不同

class Solution {
public:
    vector<int> shuffle(vector<int>& nums, int n) {
        vector<int> ret(nums.begin(),nums.end());
        for(int i = 0;i < 2*n;i++){
           if(i&1){
               //如果i为奇数
                ret[i] = nums[n + i / 2];
           }else{
               //如果i为偶数
               ret[i] = nums[(i+1) / 2];
           }
        }
        return ret;
    }
};

 

1929. 数组串联

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

 

1920. 基于排列构建数组

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

 

1480. 一维数组的动态和

法一:

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

法二:

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

 

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

方法一:利用数学知识,将字符串进行翻转

class Solution {
public:
    string reverseLeftWords(string s, int n) {
       reverse(s.begin(),s.end());
       reverse(s.end()-n,s.end());
       reverse(s.begin(),s.end()-n);
       return s;
    }
};

 

方法二:利用数学知识,将字符串进行翻转

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;
    }
};

方法三:通过空间换时间,申请一个数组,将原数组中的数按要求复制到新数组中

char* reverseLeftWords(char* s, int k){
       int i;
       int n = strlen(s);
       char *ret = (char*)malloc(sizeof(char)*(n+1));
       
       for(int i = 0;i < n; i++){
           ret[i] = s[(i + k) % n];
       }
        ret[n] = '\0';
        return ret;
    }

 

1108. IP 地址无效化

方法一: c++遍历字符串进行替换

class Solution {
public:
    string defangIPaddr(string address) {
        for(int i = 0; i < address.size();i++){
            if(address[i] == '.'){
                address.replace(i,1,"[.]");
                i += 2;
            }
        }
        return address;
    }
};

方法二:使用c语言,利用char数组进行替换

char * defangIPaddr(char * address){
    char *ret = (char*)malloc(sizeof(char)*1000);
    int returnSzie = 0;
    for(int i = 0;address[i];i++){
        if(address[i] == '.'){
            ret[returnSzie++] = '[';
            ret[returnSzie++] = '.';
            ret[returnSzie++] = ']';
        }else{
            ret[returnSzie++] = address[i];
        }
    }
    ret[returnSzie] = '\0';
    return ret;
}

 

剑指 Offer 05. 替换空格

方法一:使用c++库函数replace

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

方法二:使用c语言申请char数组,遍历替换

char* replaceSpace(char* s){
    char *ret = malloc( sizeof(char) * 30001 );
    int retSize = 0;
    for(int i = 0; s[i]; ++i) {
        if(s[i] == ' ') {
            ret[retSize++] = '%%';
            ret[retSize++] = '2';
            ret[retSize++] = '0';
        }else {
            ret[retSize++] = s[i];
        }
    }
    ret[retSize] = '\0';
    return ret;
}

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

C++双层for循环,直接暴力解

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
       vector<int> ret;
       int n = nums.size();
       for(int i = 0;i < n; i++){
           int count = 0;
           for(int j = 0;j < n; j++){
             nums[j] < nums[i] ? count++ : count+=0;
           }
           ret.push_back(count);
       }
        return ret;

    }
};

 

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

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

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

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

 

三、今日收获

1.了解了如何在LeetCode提交带指针的题目,掌握了需要返回一维数组的题目的相关范式

2.了解到判断奇偶的一种新写法 

if(i&1 == 1) 等价于if(i % 2 != 0) ,即表示如果i为奇数

if(I&1 == 0)等价于if(i%2 == 0),即表示如果i为偶数

 

四、今日疑问

五、其他参考

六、博文链接

...全文
31 回复 1 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
相关推荐
发帖
万人千题
加入

6.0w+

社区成员

学习「 算法 」的捷径就是 「 题海战略 」,社区由「 夜深人静写算法 」作者创建,三年ACM经验,校集训队队长,亚洲区域赛金牌,世界总决赛选手。社区提供系统的训练,答疑解惑,面试经验,大厂内推等机会
帖子事件
创建了帖子
2022-01-15 20:16
社区公告

QQ群:480072171

英雄算法交流 8 群