hello,大家好,这里是bang___bang_,本篇记录2道牛客习题,第一个只出现一次的字符(简单),小易的升级之路(简单),如有需要,希望能有所帮助!
目录
1️⃣第一个只出现一次的字符
2️⃣小易的升级之路
1️⃣第一个只出现一次的字符
第一个只出现一次的字符_牛客题霸_牛客网 (nowcoder.com)
描述
在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
数据范围:0≤n≤10000,且字符串只有字母组成。
要求:空间复杂度 O(n),时间复杂度 O(n)
示例1:
输入:"goole"
返回值:4
示例2:
输入:"aa"
返回值:-1
解题思路:
既然要找第一个只出现一次的字符,那只要我们统计每个字符在字符串中出现的次数,就可以找到只出现一次的字符了。
统计频率可以建立一个哈希表,遍历字符串的同时,统计每个字符出现的频率,然后再从头遍历一次字符串,在哈希表中查看每个字符串的频率,找到第一个只出现一次的字符串,返回位置,如果没找到返回-1即可。
1.遍历字符串,每个字符放入哈希表中统计频率。
2.再次遍历字符串,检测频率为1的字符,找到第一个即可。
3.遍历完,没找到,返回-1。
C++11提供了哈希表,其中一种便是unordered_map,本题使用该容器,可以快速解决。
代码实现:
#include <unordered_map>
class Solution {
public:int FirstNotRepeatingChar(string str) {unordered_map<char, int>mp;for(int i=0;i<str.size();i++){mp[str[i]]++;}for(int i=0;i<str.size();i++){if(mp[str[i]]==1)return i;}return -1;}
};
2️⃣小易的升级之路
小易的升级之路_牛客题霸_牛客网 (nowcoder.com)
描述
小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3...bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?
输入描述:
对于每组数据,第一行是两个整数n(1≤n<100000)表示怪物的数量和a表示小易的初始能力值. 然后输入n行,每行整数,b1,b2...bn(1≤bi≤n)表示每个怪物的防御力
输出描述:
对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值
示例:
输入:3 50
50 105 200
5 20
30 20 15 40 100
输出:110
205
解题思路:
怪物防御力 bi 小于等于 小易的当前能力值 c,使得自己的能力值 增加bi;
如果 bi 大于 c 他的能力值,只能 增加bi 与 c 的 最大公约数。
也就是说这道题的考点就只是求解最大公约数,求解最大公约数我们可以采用辗转相除法(欧几里得算法)
核心逻辑:
while((c=a%b)){a=b;b=c;}return b;
代码实现:
#include <iostream>
#include<vector>
using namespace std;int get_gcd(int a,int b)
{int c;while((c=a%b)){a=b;b=c;}return b;
}int main() {int n,start;while(cin>>n>>start){vector<int>v(n,0);for(int i=0;i<n;i++){cin>>v[i];}for(int i=0;i<n;i++){if(start>=v[i])start+=v[i];else{int res=get_gcd(v[i],start);start+=res;}}cout<<start<<endl;}
}
文末结语,本篇记录了2道牛客习题,1道简单题(第一个只出现一次的字符);1道简单题(小易的升级之路),本文旨在记录,如有需要,希望能有所帮助!!