每日一题 | day13(参数解析 | 跳石板)
Posted WhiteShirtI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 | day13(参数解析 | 跳石板)相关的知识,希望对你有一定的参考价值。
选择题
1、在嵌套使用if语句时,C语言规定else总是______。
A.和之前与其具有相同缩进位置的if配对
B.和之前与其最近的if配对
C.和之前与其最近的且不带else的if配对
D.和之前的第一个if配对
正确答案 C :错选了B,因为最近的if可能有else就不能和它匹配了
2、下列对重载函数的描述中,____________是错误的。
A.重载函数中不允许使用默认参数
B.重载函数中编译时根据参数表进行选择
C.构造函数重载将会给初始化带来多种方式
D.不要使用重载函数来描述毫无相干的函数
正确答案 A :重载函数可以自带默认参数
编程题
题目1:
解题及代码思路:
定义三个变量,一个用于保存单一参数tmp,一个用于保存每个单一参数vec,一个用于判断是否属于双引号之内的状态flag,初始化为false,表示没有双引号
判断当前遇到的字符
- 遇到双引号,则将flag状态取反,如果为true则表示遇到起始的双引号,如果为false则表示不在双引号之内或者这个双引号是第二个结束双引号
- 判断是否为空格,如果是空格,而且flag为false,表示不在双引号内遇到空格,表示单一的参数的结束位置,将这个参数保存vec中并置空
- 既不是引号也不是空格,则表示是在遍历中的字符,就将字符添加到当前遍历的单一字符串tmp中
结束后,我们最后一个单一参数并没有保存,我们需要将最后一个参数tmp保存后再输出相对应的信息
代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void divisionStr(const string& str)
{
string tmp = "";//用于保存单一参数
vector<string> vec;//保存每个单一参数,也就是结果
bool flag = false;//用于判断是否处于字符串的状态
for (int i = 0; i < str.size(); ++i)
{
if (str[i] == '"')//判断是否是字符串的起始或者结束
{
flag = !flag;//遇到双引号个数:单数为true,表示起始位置,双数为false,表示结束
}
else if (str[i] == ' ' && !flag)//为空格并且双引号为双数表示该字符串的空格不是双引号里面的
{
vec.push_back(tmp);
tmp = "";
}
else //正常的参数内容
{
tmp += str[i];
}
}
vec.push_back(tmp);//追加最后一个参数
cout << vec.size() << endl;
for (int i = 0; i < vec.size(); ++i)
cout << vec[i] << endl;
}
int main()
{
string str;
while (getline(cin, str))
{
divisionStr(str);
}
return 0;
}
题目2:
解题及代码思路:这道题用到了动态规划算法。我们读懂题干后来模拟一下整个场景,假设n=4,m=24。
- 定义一个用来保存当前走到某个数字上最少的步数step,例如step[24] == 5,则表示走到24这个数字最少需要5步。有m+1个元素,且初始化都为INT_MAX,表示都不能到达任何位置
- 将当前位置置为0,step[n]=0
- 从n开始,循环到m,循环每一个数到m的最少步数
- 如果是step[i] == INT_MAX则表示没有步数能到达这,继续循环下一个数字即可
- 能循环下来的都是能到达的,就求当前数的因数,保存在一个数组arr中,然后循环因数个数次,去设置加上因素后当前数字的所需步数,如果加上因数后小于等于m,并且这个数字位置上的步数还不是INT_MAX,则表示这里有人走过。则需要判断当前位置上的步数小还是我新到来的步数小,谁先谁就是当前位置的步数,如果这个数只是小于等于m,则表示新来的,需要将指定位置步数+1
- 最后返回m位置上的步数,如果step[m]为INT_MAX则表示没人走过,也就是不可达到,返回-1.否则就返回m位置上的步数
代码:
#include <iostream>
#include <vector>
#include <limits.h>
#include <math.h>
using namespace std;
void get_div_num(int v, vector<int>& arr)
{
for (int i = 2; i <= sqrt(v); ++i)
{
if (v % i == 0)
{
arr.push_back(i);
if (v /i != i)
{
arr.push_back(v / i);
}
}
}
}
int jump(int n, int m)
{
vector<int> step(m + 1, INT_MAX); //INT_MAX表示不可到达
step[n] = 0;//当前位置初始化,步数为0
for (int i = n; i < m; ++i)
{
if (step[i] == INT_MAX)
continue;
vector<int> arr;
//获取i的约数并保存
get_div_num(i, arr);
for (int j = 0; j < arr.size(); ++j)
{
//这里已经有人走过了,需要判断这个位置上的步数少还是我即将到这里的步数少
if (arr[j]+i <= m && step[i+arr[j]] != INT_MAX)//需要挑选最小值
{
step[arr[j]+i] = step[arr[j]+i] < step[i]+1 ? step[arr[j]+i] : step[i]+1;
}
else if (arr[j]+i <= m)//位置没人走过,则赋值
{
step[arr[j]+i] = step[i] + 1;
}
}
}
return step[m] == INT_MAX ? -1 : step[m];
}
int main()
{
int n, m, min_step;
while (cin >> n >> m)
{
min_step = jump(n, m);
cout << min_step << endl;
}
return 0;
}
以上是关于每日一题 | day13(参数解析 | 跳石板)的主要内容,如果未能解决你的问题,请参考以下文章