[每日习题]第一个只出现一次的字符 小易的升级之路——牛客习题

        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道简单题(小易的升级之路),本文旨在记录,如有需要,希望能有所帮助!!

猜你喜欢

转载自blog.csdn.net/bang___bang_/article/details/132124137
今日推荐