华为OD机考0017-0018:第K长的字串-逢7过

0017 第k长的字串

题目描述

给定一个字符串 只包含大写字母 求在包含同一字母的子串中 长度第K长的子串 相同字母只取最长的子串

输入

第一行 一个子串 1<len<=100 只包含大写字母 第二行为k的值

输出

连续出现次数第k多的字母的次数

样例:

    
例子:     

输入             AABAAA             2     

输出             1       

同一字母连续出现最多的A 3次       第二多2次  但A出现连续3次     

输入     AAAAHHHBBCDHHHH    3     

输出    2 

//如果子串中只包含同一字母的子串数小于k 则输出-1  

C++代码

//
// Created by HANWENKE on 2022/9/1.
//
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
//接下来对ismap排序
bool cmp(const pair<char,int>&a,const pair<char,int>&b){
    return a.second>b.second;
}
int main(){
    string s;
    getline(cin,s);
    //首先要记录每个字符在字符串中出现的次数
    //如果是不连续出现了多次--那么就要记长度更改为出现次数最多的

    int k;
    cin>>k;
    unordered_map<char,int>ismap;
    char cur=s[0];
    int count=1;
    ismap[cur]=count;//记录第一个元素的个数
    for(int i=1;i<s.length();i++){
        char c=s[i];
        //如果与第一个字符相等的化个数加1
        if(c==cur) count++;
        else{
            cur=c;
            count=1;
        }
        //判断这个字符是否在map中出现过
        if(ismap.count(cur)){
            //比较它现在的长度是否是大于之前的长度的
            if(ismap[cur]<count){
                //如果现在的长度是大于之前的长度,那么就将此字符的长度置为现在的值
                ismap[cur]=count;
            }
        }else{
            ismap[cur]=count;
        }
    }
    vector<pair<char,int>>temp;
    for(auto &x:ismap){
        temp.push_back(x);
    }
    sort(temp.begin(),temp.end(),cmp);
    //如果不同字符的个数小于k--输出-1
    if(temp.size()<k) {
        cout<<-1;
    }
    //下标是从0开始,所以是K-1
    cout<<temp[k-1].second;
    return 0;
}

0018逢7过

题目描述:

喊7 是一个传统的聚会游戏N个人围成一圈,按顺时针从1-7编号, 编号为1的人从1开始喊数,下一个人喊得数字是上一个人喊得数字+1,但是当将要喊出数字7的倍数或者含有7的话,不能喊出 而是要喊过
假定N个人都没有失误。
当喊道数字k时,可以统计每个人喊 “过"的次数

现给定一个长度n的数组,存储打乱的每个人喊”过"的次数,请把它还原成正确顺序

即数组的第i个元素存储编号i的人喊“过“的次数

输入

输入为1行
空格分割的喊过的次数
注意k并不提供

​ k不超过200
​ 数字个数为n

输出描述

输出为1行
顺序正确的喊过的次数 空格分割

样例:


例子
输入
0 1 0
输出
1 0 0

只有一次过
发生在7
按顺序编号1的人遇到7  所以100
结束时的k不一定是7 也可以是 8 9
喊过都是100

例子
输入
0 0 0 2 1
输出
0 2 0 1 0
一共三次喊过
发生在7 14 17
编号为2 的遇到7 17
编号为4 的遇到14

代码

//
// Created by HANWENKE on 2022/9/1.
//
#include <iostream>
#include <vector>
#include <string>
using  namespace std;
int main(){
    vector<int>arr;
    int temp;
    while(cin>>temp){
        arr.push_back(temp);
        if(getchar()=='\n')break;
    }
    //统计出现7的次数
    int sum=0;
    for(int i=0;i<arr.size();i++){
        sum+=arr[i];
    }
    vector<int>arr1(arr.size(),0);
    int j=0;
    for(int i=1;i<300;i++,j++){
        //统计在300以为编号为i的人身上会出现几次为7个数
        if(j==arr.size())j=0;
        //判断i中是否含有7
        bool flag=false;
        string ss=to_string(i);
        for(int k=0;k<ss.length();k++){
            if(ss[k]=='7'){
                flag= true;
                break;
            }
        }
        //如果是7的倍数或者数字中含有7-那么就对第i个人加1
        if(i%7==0||flag){
            arr1[j]+=1;
        }
        //

        //记录我当前数组中逢7过的次数
        int sum1=0;
        for(auto &x:arr1){
            sum1+=x;
        }
        //如果逢7过的次数与给的次数相同,那么就结束循环
        if(sum==sum1) break;
    }
    for(auto &x:arr1){
        cout<<x<<" ";
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HANWEN KE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值