牛客刷题系列之进阶版


CSDN话题挑战赛第2期
参赛话题: 面试宝典

很多小伙伴为了刷题发愁
今天为大家推荐一款刷题神奇哦:刷题面试神器牛客
各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有,赶快来装备自己吧!助你面试稳操胜券,solo全场面试官

一:参数解析

1.1题目

image-20220927091758648

[题目链接](参数解析_牛客题霸_牛客网 (nowcoder.com))

1.2 解析与代码

#include <iostream>
#include<string>
#include<vector>
using namespace std;

void process(string& s)
{
    string tem;
    bool flag = false; //还没有进入“ ,或者已经结束进入了
    vector<string> v;
    for(int i=0;i<s.size();i++)
    {
        if(s[i] == '"')
        {
            flag = !flag;
        }
        else if(s[i] == ' ' && !flag)
        {
            v.push_back(tem);
            tem="";
        }
        else
        tem+=s[i];
    }
      v.push_back(tem);
      cout<<v.size()<<endl;
      for(int i=0;i<v.size();i++)
      {
          cout<<v[i]<<endl;
      }
}
int main() {
   string s;
    while (getline(cin,s)) { // 注意 while 处理多个 case
       process(s);
    }
}
  1. 先全部获取,然后依次处理
  2. 一个一个字符来进行处理,不容易出错
  3. 通过flag来判断是否进入了 “ ”内,假如进入了:空格可以被忽略
  4. 将处理好的字符串放入vector容器中,方便管理

1.3总结和反思

其实这道题是我第二次做了,但还是没有完全ac,原因就是因为自己还是在一个空格一个空格的来区分字符串,并没有清楚的认识到一个字符一个字符来处理字符串其实是更好的选择

  • 反思:

以后遇到处理字符串的问题,尽量在字符层面上细致的处理。

二:幸运的袋子

2.1 题目

image-20220927092606733

2.2解析与代码

#include<iostream>
#include<algorithm>
using namespace std;
int get(int* arr, int n, int pos, int add,
        int multi) { //pos:访问到的位置   add:加到了多少  multi; 乘到了多少
    int count = 0;
    for (int i = pos; i < n; i++) {
        add += arr[i];
        multi *= arr[i];

        if (add > multi) { //假如add > multi , 该条件满足,并且往下面找满足的条件
            count += 1 + get(arr, n, i + 1, add, multi);
        } else if (arr[i] ==
                   1) //假如arr[i]==1 ,则该条件无效, 向后面找寻有效条件
            count += get(arr, n, i + 1, add, multi);

        else
            break;

        add -= arr[i];
        multi /= arr[i];
        while (i < n - 1 &&
                arr[i] == arr[i + 1]) { //将相同项移出,不再假如循环
            i++;
        }
    }
    return count;

}
int main() {
    int n;
    cin >> n;
    int arr[n];
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    sort(arr, arr + n); //先将数组排序
    cout << get(arr, n, 0, 0, 1);


    return 0;
}

  1. 利用到了一个数学结论: 对于任意两个正整数a,b如果满足 a+b>a*b,则必有一个数为1.

  2. 基于这个结论,我们先将数组排好序,进入函数

  3. 根据情况依次递归

    1. 假如add > multi , 该条件满足,并且往下面找满足的条件
    2. 假如arr[i]==1 ,则该条件无效, 向后面找寻有效条件
    3. 假如arr[i]==1 ,则该条件无效, 向后面找寻有效条件
    
  4. 将相同项移出,不再假如循环

总结与反思

递归的题还是找不到思路,得多练

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雪芙花

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

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

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

打赏作者

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

抵扣说明:

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

余额充值