每日一题 | day22(小易的升级之路 | 找出字符串中第一个只出现一次的字符)
Posted WhiteShirtI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 | day22(小易的升级之路 | 找出字符串中第一个只出现一次的字符)相关的知识,希望对你有一定的参考价值。
选择题
1、下列数据结构具有记忆功能的是?
A 队列
B 循环队列
C 栈
D 顺序表
正确答案 C:
2、若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。
A 顺序表
B 双链表
C 带头结点的双循环链表
D 单循环链表
正确答案 A:
3、对递归程序的优化的一般的手段为()
A 尾递归优化
B 循环优化
C 堆栈优化
D 停止值优化
正确答案 A:尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出
4、将一颗有 100 个结点的完全二叉树从根这一层开始,每一层从左到右依次对结点进行编号,根节点编号为 1 ,则编号为 98 的节点的父节点编号为()
A 47
B 48
C 49
D 50
正确答案 C:根节点编号为 1 ,假如父亲结点编号为n,则左孩子编号为2n,右孩子编号为2n+1;无论是左孩子还是右孩子,编号为n时,父亲结点的编号为n/2。根节点编号为0,假如父节点编号为n,则左孩子编号为2n+1,右孩子编号2n+2;无论是左孩子还是右孩子,编号为n时,父亲结点的编号为(n-1)/2
编程题
题目1:
题解思路:
题目很容易理解,如果遇到的怪物防御力bi小于等于小易的当前能力值c,则c = c + bi。如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数。我们可以写一个求最大公约数的函数
代码:
#include <iostream>
#include <vector>
using namespace std;
int gcb(int a, int b)
{
while (a != 0)
{
int tmp = b % a;
b = a;
a = tmp;
}
return b;
}
int power(int n, int a, vector<int> vec)
{
for (int i = 0; i < n; ++i)
{
if (vec[i] <= a)
a += vec[i];
else
a += gcb(a, vec[i]);
}
return a;
}
int main()
{
int n, a;
while (cin >> n >> a)
{
vector<int> vec(n);
for (int i = 0; i < n; ++i)
{
cin >> vec[i];
}
cout << power(n, a, vec) << endl;;
}
return 0;
}
题目2:
题解思路:申请一个哈希数组,用于记录字母出现的次数,下标为对应的字母,下标对应的值就是该字母出现的频率。第二次再遍历字符串,当遍历到的字符作为哈希数组的下标对应的值为1,则表示该字符只出现一次,且是第一个出现的,此时就可以立即输出返回。当遍历完hash数组还没有找到,则表示不存在这样子的字符,输出-1
代码:
#include <iostream>
using namespace std;
int main()
{
string str;
while (getline(cin, str))
{
int* hash = new int[123];
for (int i = 0; i < str.size(); ++i)
{
hash[str[i]]++;
}
int i;
for (i = 0; i < str.size(); ++i)
{
if (hash[str[i]] == 1)
{
cout << str[i] << endl;
break;
}
}
if (i == str.size())
cout << -1 <<endl;
}
return 0;
}
以上是关于每日一题 | day22(小易的升级之路 | 找出字符串中第一个只出现一次的字符)的主要内容,如果未能解决你的问题,请参考以下文章
每日一题LeedCode day01 存在重复元素小夜斗力扣修炼之路