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


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

    目录

    1480.一维数组的动态求和

    383. 赎金信

    412. Fizz Buzz

    876. 链表的中间结点

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

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


    1480.一维数组的动态求和

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

    1. class Solution {
    2. public:
    3. vector<int> runningSum(vector<int>& nums) {
    4. vector<int> sum;
    5. int flag = 0;
    6. for(int i=0; i<size(nums); i++){
    7. sum.push_back(flag+nums[i]);
    8. flag = flag+nums[i];
    9. }
    10. return sum;
    11. }
    12. };
    13. //官方
    14. class Solution {
    15. public:
    16. vector<int> runningSum(vector<int>& nums) {
    17. int n = nums.size();
    18. for (int i = 1; i < n; i++) {
    19. nums[i] += nums[i - 1];
    20. }
    21. return nums;
    22. }
    23. };
    24. //其他
    25. class Solution {
    26. public:
    27. vector<int> runningSum(vector<int>& nums) {
    28. int sumn = 0;
    29. vector<int> ret;
    30. for (int i = 0; i < nums.size(); i++) {
    31. sumn += nums[i];
    32. ret.push_back(sumn);
    33. }
    34. return ret;
    35. }
    36. };

    解析:

    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

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

    【官方】 

    1. class Solution {
    2. public:
    3. bool canConstruct(string ransomNote, string magazine) {
    4. if (ransomNote.size() > magazine.size()) {
    5. return false;
    6. }
    7. vector<int> cnt(26);
    8. for (auto & c : magazine) {
    9. cnt[c - 'a']++;
    10. }
    11. for (auto & c : ransomNote) {
    12. cnt[c - 'a']--;
    13. if (cnt[c - 'a'] < 0) {
    14. return false;
    15. }
    16. }
    17. return true;
    18. }
    19. };

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

    1. //错误待修改!
    2. class Solution {
    3. public:
    4. bool canConstruct(string ransomNote, string magazine) {
    5. //1.ransomnote字符长度为0
    6. if(ransomNote.size()==0)
    7. {
    8. return true;
    9. }
    10. //2.ransomnote字符长度magazine
    11. if(ransomNote.size()> magazine.size())
    12. {
    13. return false;
    14. }
    15. //3.判断
    16. if(ransomNote.size()< magazine.size())
    17. {
    18. for(int i = 0; isize();i++){
    19. for(int j = 0; jsize();j++){
    20. if(ransomNote[i]==magazine[j]){
    21. //需要匹配完删除,但会影响magazine长度!存疑!
    22. magazine[j]='0';//换写?
    23. continue;}
    24. return true; }
    25. return false;
    26. } }
    27. return false;
    28. }
    29. };

    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拍手游戏。

    1. class Solution {
    2. public:
    3. vector fizzBuzz(int n) {
    4. //1.答案容器
    5. vector answer;
    6. //2.遍历1~n
    7. for(int i = 1; i<=n; i++){
    8. string curr;
    9. if(i % 3 == 0 ){
    10. curr += "Fizz";
    11. }
    12. if( i % 5 == 0){
    13. curr += "Buzz";
    14. }
    15. if(curr.size() == 0){
    16. //to_string将数字常量转换为字符串,返回值为转换完毕的字符串
    17. curr += to_string(i);
    18. }
    19. //3.向容器添加数据,C++ 11,区别 push_back, push_front
    20. answer.emplace_back(curr);
    21. }
    22. return answer;
    23. }
    24. };

    876. 链表的中间结点

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

    示例 1:

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

    思考: 

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

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

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

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

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

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

    思考:

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

    • 偶数:除以2;
    • 奇数:减1;
    • 循环while思路,基础思路。
    1. class Solution {
    2. public:
    3. int numberOfSteps(int num) {
    4. int res = 0 ;
    5. while(num > 0){
    6. if(num % 2 == 0){
    7. num = num/2;
    8. }
    9. else {
    10. num--;
    11. }
    12. res++;
    13. }
    14. return res;
    15. }
    16. };

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

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

    思考:

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

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

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

    3.遍历求和

    4.取最值

    1. class Solution {
    2. public:
    3. int maximumWealth(vectorint>>& accounts) {
    4. int rich =0;
    5. for(int i=0; isize();i++){
    6. int sum =0;
    7. for(int j=0; j0].size();j++){
    8. sum += accounts[i][j];
    9. }
    10. rich = max(rich, sum);
    11. }
    12. return rich;
    13. }
    14. };

     

  • 相关阅读:
    【爬虫】Java爬虫爬取某招聘网站招聘信息
    猿创征文|【Vue五分钟】 Vue Cli脚手架创建一个项目
    Qt学习总结之QToolButton
    sql server 对称加密例子,很好用
    增值税发票OCR识别功能介绍
    D00242疫情防控
    网页vue3导出pdf
    PAT乙级-B1011 A+B 和 C(15)
    人工智能AI 全栈体系(七)
    【ROS】ROS2-humble安装navigation2与使用
  • 原文地址:https://blog.csdn.net/MengYa_Dream/article/details/128106220