首页 > 试题广场 > 字符串归一化
[编程题]字符串归一化
  • 热度指数:8731 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解


通过键盘输入一串小写字母(a~z)组成的字符串。
请编写一个字符串归一化程序,统计字符串中相同字符出现的次数,并按字典序输出字符及其出现次数。
例如字符串"babcc"归一化后为"a1b2c2"




输入描述:
每个测试用例每行为一个字符串,以'\n'结尾,例如cccddecca


输出描述:
输出压缩后的字符串ac5d2e
示例1

输入

dabcab

输出

a2b2c1d1
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        char[] chars=sc.nextLine().toCharArray();
        //经验,一般是用hashmap来统计出现次数的,
        //但本题是对字符统计次数,可以专门用一个counts数组来统计次数
        int[] counts=new int[26];
        for(int i=0;i<chars.length;i++){
            counts[chars[i]-'a']++;
        }
        for(int i=0;i<26;i++){
            char c=(char)('a'+i);
            int count=counts[i];
            if(count==0){
                continue;
            }else{
                System.out.print(c+""+count);
            }
        }
    }
}

发表于 2019-08-05 21:59:53 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    while(cin>>s)
    {
        sort(s.begin(),s.end());
        string res="";
        int n=1;
        cout<<s[0];
        for(int i=1;i<s.size();i++)
        {
            if(s[i]==s[i-1])
                n++;
            else
            {
                cout<<n;
                cout<<s[i];
                n=1;
            }
        }
        cout<<n<<endl;
    }
    return 0;
}

发表于 2019-06-30 18:55:06 回复(0)
#include<iostream>
#include<string>
using namespace std;
int main(){
    int count[26] = {0};   //记录每个字母的个数
    string s;
    cin >> s;
    for(int i = 0; i < s.length(); i++){
        count[s[i]-'a']++;
    }
    char c = 'a';
    for(int i = 0; i < 26; i++){
        if(count[i]){
            cout << c << count[i];
        }
        c++;
    }
    cout << endl;
    return 0;
}

发表于 2019-09-03 23:03:31 回复(0)
发表于 2018-11-07 15:49:16 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
while(cin>>s){
int l = s.length();
int cnt[26] = {0};
for(int i=0;i<l;i++)
cnt[s[i]-'a']++;
for(int i=0;i<26;i++){
if(cnt[i]>=1)
cout<<char('a'+i)<<cnt[i];
}
cout<<endl;
}
return 0;
}

发表于 2019-07-07 22:55:35 回复(0)
string = input()
for i in sorted(list(set(string))):
    item = string.count(i)
    print(i + str(item), end = '')

发表于 2019-10-10 22:00:53 回复(0)
#include<iostream>
using namespace std;

const int SIZE = 128;
int main()
{
    
    int num[26] = {0};             //26个字母
    char buf[SIZE];                //定义输入字符的buf大小
    fgets(buf,SIZE,stdin);          //键盘输入
    int i = 0;
    while(buf[i]!='\n')            //循环检测相同的字母
    {
        ++num[buf[i++]-'a'];       //检测到相同的字母,++操作
        if(i==SIZE)            // 考虑输入太多的字母的条件
        {
            i = 0;
            fgets(buf,SIZE,stdin);
        }

    }
    i = 0;
    while(i<26)                 //循环输出
    {
        if(num[i]!=0)        //判断字母存在不,没有则不用输入
        {
            //printf("%c%d",i+'a',num[i]);
            char p;
            p = i+'a';     //按照字符的顺序输出
            cout<<p<<num[i];    
        }
        ++i;
    }
    cout<<endl;
    return 0;
        
}

发表于 2019-10-09 17:30:40 回复(0)
#include <iostream>
#include <string>
using namespace std;
int main()
{     int a[26] = { 0 };     string str;     cin >> str;     for (int i = 0; i < str.size(); i++)     {         a[str[i] - 'a']++;     }
    char ch = 'a';
    for(int j = 0;j<26;j++)
    {
        if(a[j])
            cout << ch << a[j];
        ch++;
    }     return 0;
}
编辑于 2019-10-07 21:34:59 回复(0)
#include<iostream>
#include<string>
#include<map>

using namespace std;

int main(){
    string s;
    getline(cin,s);
    map<char,int> m;//map自动排序
    for(int i=0;i<s.length();i++){
        m[s[i]]++;
    }
    auto it=m.begin();
    while(it!=m.end()){
        cout<<it->first<<it->second;
        it++;
    }
    return 0;
}
发表于 2019-08-23 20:02:20 回复(2)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Solution6_字符串归一化 {

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String str = bf.readLine();
        //存储每个字母出现的次数,0~a,1~b
        int[] nums = new int[26];
        for (int i = 0; i < str.length(); i++) {
            nums[str.charAt(i) - 'a']++;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 26; i++) {
            if (nums[i] > 0) sb.append((char) (i + 'a')).append(nums[i]);
        }
        System.out.println(sb.toString());
    }
}
发表于 2019-08-03 19:57:30 回复(0)
"""
使用Counter计数器
"""
import sys
import collections

if __name__ == "__main__":
    # sys.stdin = open("input.txt", "r")
    s = input().strip()
    obj = collections.Counter(s)
    d = sorted(obj.items(), key=lambda c: c[0])
    ans = ""
    for i in range(len(d)):
        ans += str(d[i][0]) + str(d[i][1])
    print(ans)

发表于 2019-07-06 21:25:13 回复(0)

import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String str = sc.nextLine();
int [] array=new int [26];
for (int i = 0; i < str.length(); i++)
array[str.charAt(i)-'a']++;
for (int i = 0; i < 26; i++)
{
if(array[i]>=1)
System.out.print((char)('a'+i));
if(array[i]>1)
System.out.print(array[i]);
}
}

}


编辑于 2019-07-11 17:00:37 回复(0)
fromcollections importCounter
 
s =input()
 
c =Counter(s)
 
ans =''
fork insorted(c.keys()):
    ans +=k
    ans +=str(c[k])
 
print(ans)

发表于 2019-03-30 14:30:40 回复(1)
n = input()
n_dict = {}
for i in n:
    if i not in n_dict:  # 若dict中不包含此元素
        n_dict.update({i: 1})  # 将元素以 {元素:出现次数} 的格式,添加到dict中
    else:
        n_dict[i] += 1  # 若存在元素,则将对应元素的出现次数+1

# 格式化输出
res_list = []
for i in n_dict:
    res_list.append(str(i) + str(n_dict[i]))
res_list.sort()
for i in res_list:
    print(i, end='')  # 输出不换行

发表于 2019-09-20 15:52:28 回复(0)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

//总结目前牛客问题 第一,没有循环输入问题, 第二 有循环输入问题, 第三 输入有多余空格问题 ,第四 中间插入多余空行问题 ....
namespace Test0001
{
    class Program
    {
        public static void Main(string[] args)
        {
            string line;
            while (!string.IsNullOrEmpty(line = Console.ReadLine())) Func(line);
        }

        public static void Func(string line)
        {
            Console.WriteLine(String.Join("", line.Trim().GroupBy(x => x).Select(x => new { key = x.Key, count = x.Count() }).OrderBy(x => x.key).Select(x => $"{x.key}{ x.count}")));
        }
    }
}
Linq一行代码搞定,按照字符分组并且拆分个数之后按照字典顺序排序,之后输出
发表于 2019-12-04 16:42:27 回复(0)
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main(int argc,char * argv[]){
    string s;
    cin>> s;
    
    int L = s.length();
    unsigned int num[26] = {0};
    for(int i = 0;s[i];i++){
        num[s[i]-'a']++;//计数
    }
    
    string s_out;
    for(int i = 0;i<26 && num[i]>=1;i++){
        s_out+=char('a'+i);
        s_out+=to_string(num[i]);//不要排序
    }
    cout<<s_out<<endl;
    
        
}

发表于 2019-11-22 17:44:08 回复(0)
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    const int SIZE = 26;
    char ch;
    vector<int> vec(SIZE,0);
    while(cin >> ch)
        vec[ch - 'a'] += 1;
    for(int i = 0; i < SIZE; ++i)
    {
        if(vec[i])
        {
            cout << static_cast<char>(i + 'a');
            if(vec[i] > 1)
               cout << vec[i];
        }
    }
    return 0;
}

发表于 2019-11-18 10:16:36 回复(0)
package main

import (
	"fmt"
	"sort"
	"strings"
)

func main() {
	var str string
	fmt.Scanln(&str)
	arr := strings.Split(str, "")
	sort.Strings(arr)
	m:=1
	for i:=0;i<len(arr) ;i++  {

			if i+1<len(arr)&&arr[i]==arr[i+1] {
				m++
			}else {
				fmt.Printf("%s%d",arr[i],m)
				m=1
			}
		}

}

发表于 2019-11-03 14:58:17 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            char[] cc=sc.nextLine().toCharArray();
            System.out.println(count(cc));
        }
    }
    public static String count(char[] cc){
        if(cc.length<1){
            return "";
        }
        StringBuffer sb=new StringBuffer();
        int[] words=new int[26];
        for(int i=0;i<cc.length;i++){
            words[cc[i]-'a']++;
        }
        for(int i=0;i<26;i++){
            char c=(char)(i+'a');
            if(words[i]==0){
                continue;
            }else{
                sb.append(c+""+words[i]);
            }
        }
        return sb.toString();
    }
}

发表于 2019-10-03 10:33:14 回复(0)
#思考,如果需要循环的话,先对数据去重
#在去重的数据中对元素循环,在原始数据中进行count计算
#直接输出进行拼接 print()默认换行,加上参数end=''不换行输出
str_ = input() #按行输入
str_sort = sorted(set(str_)) #使用set去重后排序
for ch in str_sort:
    print(ch + str(str_.count(ch)),end ='')
print()

编辑于 2019-09-22 13:47:19 回复(0)