CSDN话题挑战赛第2期
参赛话题: 面试宝典
很多小伙伴为了刷题发愁
今天为大家推荐一款刷题神奇哦:刷题面试神器牛客
各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有,赶快来装备自己吧!助你面试稳操胜券,solo全场面试官
一:参数解析
1.1题目
[题目链接](参数解析_牛客题霸_牛客网 (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);
}
}
- 先全部获取,然后依次处理
- 一个一个字符来进行处理,不容易出错
- 通过flag来判断是否进入了 “ ”内,假如进入了:空格可以被忽略
- 将处理好的字符串放入vector容器中,方便管理
1.3总结和反思
其实这道题是我第二次做了,但还是没有完全ac,原因就是因为自己还是在一个空格一个空格的来区分字符串,并没有清楚的认识到一个字符一个字符来处理字符串其实是更好的选择
- 反思:
以后遇到处理字符串的问题,尽量在字符层面上细致的处理。
二:幸运的袋子
2.1 题目
- [题目链接](幸运的袋子_牛客题霸_牛客网 (nowcoder.com))
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;
}
-
利用到了一个数学结论: 对于任意两个正整数a,b如果满足 a+b>a*b,则必有一个数为1.
-
基于这个结论,我们先将数组排好序,进入函数
-
根据情况依次递归
1. 假如add > multi , 该条件满足,并且往下面找满足的条件 2. 假如arr[i]==1 ,则该条件无效, 向后面找寻有效条件 3. 假如arr[i]==1 ,则该条件无效, 向后面找寻有效条件
-
将相同项移出,不再假如循环
总结与反思
递归的题还是找不到思路,得多练