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

YUAN_798 YUAN_798 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

一、今日知识点总结

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为偶数

 

四、今日疑问

无

五、其他参考

无

六、博文链接

无

...全文

相关推荐

leetcode第四题-LeetCode_Exercise:力扣_练习

leetcode 第四题力扣_练习 位掩码 结束了一些位操作和位掩码练习,难度由低到高总结了几道非常讲的位运算和位掩码题,难度由低到高 (简单的) (简单的) (强烈推荐) (中等的) (中)(强烈推荐) (中)(强烈推荐,即使你能想到每个元素出现4、5、6次而只有一个出现1次的问题,你怎么解决) (中)(强烈推荐) (难)(强烈推荐) 为什么我们需要使用Bitmask来处理一些棘手的问题? 原因1:位操作比'+-*/'等正常操作更快 原因2:位掩码可以帮助我们记录状态。 如果您使用 int 变量或布尔变量来存储状态,它将花费 4 个字节,因此您使用位 0/1 来存储状态,这将节省大量空间。 一些位掩码的操作: 1.记录状态 如果您有 8 个状态,则可以将位掩码设为 00000000,并使用“或 |” 操作以保存您的状态。 例如。 位掩码 = 00000000 new_state1 = 00001000 位掩码 | new_state1 = 00001000 这意味着已经记录了第四个状态 new_state2 = 00010001 位掩码 | new_state2 = 00011001

weixin_38684743

Leetcode:力扣个人代码C ++

Leetcode:力扣个人代码C ++

皮卡学长

Leet Code_力扣原题_leetcode官网_

力扣网原题,可用于求职刷题,每个程序代码都正确。

kikikuka

leetcode题库-LeetCode:力扣题库练习

leetcode题库 LeetCode 力扣题库练习 中文网址: 美版网址:

weixin_38518958

leetcode:力扣刷题

密码 力扣刷题笔记 版本历史 0.1.0 关于作者 野子- 电子邮件:

dahiod
评论
收藏 已收藏
分享
返回顶部
YUAN_798
万人千题 64,203 成员 15,010 内容