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;
}