【LeetCode】C++:新手村题单记录-重在解出问题

每个问题都先自己进行尝试,在解决问题后或者解题遇到卡顿时再去查看别人的题解和讨论帖,对于新手的你重点是先能够解出题目而不是寻找最优的解题思路。 

目录

1480.一维数组的动态求和

383. 赎金信

412. Fizz Buzz

876. 链表的中间结点

1342. 将数字变成 0 的操作次数

1672. 最富有客户的资产总量


1480.一维数组的动态求和

给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。请返回 nums 的动态和。

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

//官方
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;
    }
};
//其他
class Solution {
public:
    vector<int> runningSum(vector<int>& nums) {
        int sumn = 0;
        vector<int> ret;
        for (int i = 0; i < nums.size(); i++) {
            sumn += nums[i];
            ret.push_back(sumn);
        }
        return ret;
    }
};

解析:

1.第一眼容器嵌套容器框架

【C++提高编程】第二章 STL初识:概念|组件|容器基础

2.push_back:将容器元素插入到vector

3.官方解析


383. 赎金信

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。

思考:

字符串:ransomNote;magazine

判断:magazine字符串能否组成ransomnote字符串,同时字符串使用次数为1

过程:

考虑ransomnote字符串情况:

  • 为空?True;
  • 长度大于magazine字符串,False;
  • 长度短于magazine字符串,循环遍历删除:
    • 外遍历ransomNote字符串
    • 内遍历magazine字符串,不存在,False;存在,删除该字符;【难点】
    • 循环继续。

调研学习:哈希表法

优点:把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。编码比较容易也是它的特点之一。

基本原理:使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标,hash值)相对应,于是用这个数组单元来存储这个元素;也简单理解为,按照关键字为每一个元素“分类”,然后将这个元素存储在相应“类”所对应的地方,称为桶。

但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了“冲突”,换句话说,就是把不同的元素分在了相同的“类”之中。 总的来说,“直接定址”与“解决冲突”是哈希表的两大特点。 

1.分配内存,26个字母;memset:初始化是将数组cnt的每个元素赋值0。
2.magazine的字符计数;auto的原理就是根据后面的值,来自己推测前面的类型是什么。遍历找出字符串的每个字符的重复的个数!
3.ransomnote使用magazine的字符,同时计数减1

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        //1.分配内存,26个字母;
        //memset:初始化是将数组cnt的每个元素赋值0。
         int cnt[26];
         memset(cnt, 0, sizeof(cnt));
        //2.magazine的字符计数
        //auto的原理就是根据后面的值,来自己推测前面的类型是什么。
        //遍历找出字符串的每个字符的重复的个数!
         for(auto c:magazine){
             cnt[c-'a']++;
         }
        //3.ransomnote使用magazine的字符,同时计数减1
         for(auto c:ransomNote){
             if(--cnt[c-'a']<0) return false;
         }
         return true;
    }
};

【官方】 

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        if (ransomNote.size() > magazine.size()) {
            return false;
        }
        vector<int> cnt(26);
        for (auto & c : magazine) {
            cnt[c - 'a']++;
        }
        for (auto & c : ransomNote) {
            cnt[c - 'a']--;
            if (cnt[c - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
};

 【新手C++】383. 赎金信 

//错误待修改!
class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        //1.ransomnote字符长度为0
        if(ransomNote.size()==0)
        {
            return true;
        }
        //2.ransomnote字符长度magazine
        if(ransomNote.size()> magazine.size())
        {
            return false;
        }
        //3.判断    
        if(ransomNote.size()< magazine.size())
        {
            for(int i = 0; i<ransomNote.size();i++){
                for(int j = 0; j<magazine.size();j++){
                    if(ransomNote[i]==magazine[j]){
                        //需要匹配完删除,但会影响magazine长度!存疑!
                        magazine[j]='0';//换写?
                        continue;}  
                    return true; }
            return false;
        } }
        return false;       
    }
};

412. Fizz Buzz

给你一个整数 n ,找出从 1 到 n 各个整数的 Fizz Buzz 表示,并用字符串数组 answer下标从 1 开始)返回结果,其中:

  • answer[i] == "FizzBuzz" 如果 i 同时是 3 和 5 的倍数。
  • answer[i] == "Fizz" 如果 i 是 3 的倍数。
  • answer[i] == "Buzz" 如果 i 是 5 的倍数。
  • answer[i] == i (以字符串形式)如果上述条件全不满足。
  • 输入:n = 5
  • 输出:["1","2","Fizz","4","Buzz"]

思考:

有点类水仙花数思路,分情况讨论即可。

输出要求:类逢7拍手游戏。

class Solution {
public:
    vector<string> fizzBuzz(int n) {
        //1.答案容器
        vector<string> answer;
        //2.遍历1~n
        for(int i = 1; i<=n; i++){
            string curr;
            if(i % 3 == 0 ){
                curr += "Fizz";
            }
            if( i % 5 == 0){
                curr += "Buzz";
            }
            if(curr.size() == 0){
                //to_string将数字常量转换为字符串,返回值为转换完毕的字符串
                curr += to_string(i);
            }
            //3.向容器添加数据,C++ 11,区别 push_back, push_front
            answer.emplace_back(curr);
        }
        return answer;
    }
};

876. 链表的中间结点

给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

示例 1:

  • 输入:[1,2,3,4,5]
  • 输出:此列表中的结点 3 (序列化形式:[3,4,5]) 返回的结点值为 3 。

思考: 

链表:无法通过下标访问对应的元素。

遍历?同时将遍历到的元素依次放入数组 A 中。如果我们遍历到了 N 个元素,那么链表以及数组的长度也为 N,对应的中间节点即为 A[N/2]。

【官方】其他:快慢指针!

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        vector<ListNode*> A={head};
        //1.back()返回的的是最后一个元素的引用。
        while(A.back()->next !=NULL)
            //2.push_back容器末尾添加一个新的元素进去
            A.push_back(A.back()->next);
        return A[A.size()/2];
    }
};

1342. 将数字变成 0 的操作次数

给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。

思考:

判断奇偶数,对应不同的操作:

  • 偶数:除以2;
  • 奇数:减1;
  • 循环while思路,基础思路。
class Solution {
public:
    int numberOfSteps(int num) {
        int res = 0 ;
        while(num > 0){
            if(num % 2 == 0){
                num = num/2;            
            }
             else {
                num--;
            }  
            res++;        
        }
        return res;
    }
};

1672. 最富有客户的资产总量

给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i​​​​​ 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。

思考:

这题乍一看数组求和取最值?

1.二维数组行数 accounts.size()

2.二维数组列数 accounts[0].size()

3.遍历求和

4.取最值

class Solution {
public:
    int maximumWealth(vector<vector<int>>& accounts) {
        int rich =0;
        for(int i=0; i<accounts.size();i++){
            int sum =0;
            for(int j=0; j<accounts[0].size();j++){                
                sum += accounts[i][j];   
            }
            rich = max(rich, sum);
        }
        return rich;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MengYa_DreamZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值