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

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

成都创新互联公司专注于企业全网营销推广、网站重做改版、浈江网站定制设计、自适应品牌网站建设、H5响应式网站购物商城网站建设、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为浈江等各大城市提供网站开发制作服务。

目录

1480.一维数组的动态求和

383. 赎金信

412. Fizz Buzz

876. 链表的中间结点

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

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


1480.一维数组的动态求和

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

class Solution {
public:
    vectorrunningSum(vector& nums) {
        vectorsum;
        int flag = 0; 
        for(int i=0; irunningSum(vector& nums) {
        int n = nums.size();
        for (int i = 1; i< n; i++) {
            nums[i] += nums[i - 1];
        }
        return nums;
    }
};
//其他
class Solution {
public:
    vectorrunningSum(vector& nums) {
        int sumn = 0;
        vectorret;
        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;否则返回 falsemagazine中的每个字符只能在 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;
        }
        vectorcnt(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

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:
    vectorfizzBuzz(int n) {
        //1.答案容器
        vectoranswer;
        //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) {
        vectorA={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>& accounts) {
        int rich =0;
        for(int i=0; i

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前题目:【LeetCode】C++:新手村题单记录-重在解出问题-创新互联
文章路径:http://myzitong.com/article/cccosj.html