首页 > 试题广场 >

字符统计

[编程题]字符统计
  • 热度指数:203077 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。

数据范围:字符串长度满足


输入描述:

一个只包含小写英文字母和数字的字符串。



输出描述:

一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。

示例1

输入

aaddccdc

输出

cda

说明

样例里,c和d出现3次,a出现2次,但c的ASCII码比d小,所以先输出c,再输出d,最后输出a.
     
while True:
    try:
        li = input()
        dic = {}
        for i in range(len(li)):
            if li[i] not in dic.keys():
                dic[li[i]] = 1
            else:
                dic[li[i]] += 1
        out = []
        while max(dic.values()) != 0:
            out1 = []
            a = max(dic.values())
            for i in dic.keys():
                if dic[i] == a:
                    out1.append(i)
                    dic[i] = 0
            out1 = sorted(out1)
            for j in out1:
                out.append(j)
        print(''.join(out))
    except:
        break
发表于 2022-02-26 17:47:56 回复(0)
while True:
    try:
        str1 = input()#读取字符串
        str2 = list(str1)#转换list转存入str2
        str2 = set (str2)#去除重复项
        str2 = list(str2)#变回list
        a=[]
        for i in range (len(str2)):#计算每一项个数
            num =str1.count(str2[i])
            a.append((ord(str2[i]),num))#以(asc码,count个数)的形式添加入a里(a为list)用ord()转换为ASCII码
        a.sort(key=lambda x:x[0])#先ASCII 码升序排列
        a.sort(key=lambda x:x[1],reverse=True)#再出现次数降序排列,遇到相同的排序会预设按输入次序也就是上行ASCII的sort排序顺序
        str3=""
        for i in range (len(a)):
            str3 = str3+str(chr(a[i][0])) #用chr()换回字母数字,打印结果
        print(str3)
    except:
        break

发表于 2021-07-01 12:33:49 回复(0)
def cal(s):
    s.sort()
    dic = {}
    output = ""
    for i in s:
        dic[i] = dic.get(i,0) + 1
    lst = sorted(dic.items(),key=lambda x:x[1],reverse=True)
    for j in lst:
        output += j[0]
    print(output)
while True:
    try:
        s = list(input())
        cal(s)
    except:
        break
发表于 2021-04-20 17:58:23 回复(0)
可以用负数记录字符统计个数,解决次数降序和ASCII码升序问题
while True:
    try:
        str = input()
        chars = {}
        for x in str:
            if x in chars:
                chars[x] -= 1
            else:
                chars[x] = -1
        sorted_chars = sorted(chars.items(), key= lambda x:(x[1],x[0]))
        output = ''
        for i in range(len(sorted_chars)):
            output = ''.join([output, sorted_chars[i][0]])
        print(output)
    except EOFError:
        break


发表于 2021-03-24 21:15:46 回复(0)
import collections
while True:
    try:
        input_ = input()
        letter_dict = collections.defaultdict(int)
        for i in input_:
            letter_dict[i]+=1
        result = sorted(sorted(letter_dict, key = ord), key = letter_dict.get, reverse = True)
        print(''.join(result))
    except:
        break


发表于 2021-03-23 19:33:48 回复(0)
import sys
from collections import defaultdict


for s in sys.stdin:
    d = defaultdict(int)
    for c in s.strip():
        d[c] += 1
    chars = list(d.items())
    chars.sort(key=lambda x: ord(x[0]))
    chars.sort(key=lambda x: x[1], reverse=True)
    print("".join([x[0] for x in chars]))

发表于 2020-12-19 17:17:25 回复(0)
# 思路:关键在于两次排序:给出现次数不同的字符按次数排序(次数由多——少)
#                    给出现次数相同的字符按ascii大小来排序(小_大)
while True:
    try:
        s = input().strip()
        dic = {}
        for ch in s:
            if ch in dic:
                dic[ch] += 1
            else:
                dic[ch] = 1
        dic = sorted(dic.items(), key=lambda x: x[0])  # 先按字符ASC排
        dic = sorted(dic, key=lambda x: x[1], reverse=True)  # 再按统计数目排
        print(''.join([k for (k, v) in dic]))
    except:
        break

发表于 2020-12-01 11:44:59 回复(0)
# 2020年11月17日16:25:16
while True:
    try:
        string = input()
#       去重,去掉非统计字符
        new_string = []
        for i in range(len(string)):
            if string[i] not in new_string: 
#               只统计字母、数字、空格
                s = string[i]
                if s.isalpha()or s.isdigit()or s.isspace():
                    new_string.append(string[i])
#       利用lambda表达式降序排序,第一依据为出现次数,次数相同情况下,第二依据为ascii码的负值
        new_string.sort(key=lambda x:(string.count(x[0]), -ord(x[0])),reverse=True)
#       列表转字符串
        print("".join(new_string))
    except:
        break
        

编辑于 2020-11-17 17:02:20 回复(0)

字典计数,列表存储次数,按要求输出


while 1:
    try:
        st = input()
        # dic计数
        dic = dict()
        for i in st:
            dic[i] = dic.get(i,0)+1
        # 对dic值,去重后降序
        value_list = list(set([j for j in dic.values()]))
        value_list.sort(reverse=True)
        res = [ ]
        for m in value_list:
            # 若次数相同,对多个key做升序,即ASCII码由小到大
            temp = [k for k,v in dic.items() if v==m] 
            temp.sort(reverse=False)
            # 使用extend而非append
            res.extend(temp)
        print(''.join(res))
    except:
        break



发表于 2020-10-11 00:03:36 回复(0)
from collections import defaultdict
while True:
    try:
        s, res = input().strip(), ''
        dd = defaultdict(int)
        for i in s:
            if i.isalpha()&nbs***bsp;i.isdigit()&nbs***bsp;i == ' ':
                dd[i] += 1
        tmp = sorted(dd.items(), key=lambda x: (-x[1], x[0]) )
        for i in tmp:
            res += i[0]
        print(res)
    except:
        break

发表于 2020-10-03 21:56:43 回复(0)
while True:
    try:
        str = input()
        dicts = {}
        for i in str:
            if i.isspace()&nbs***bsp;i.isdigit()&nbs***bsp;i.isalpha():
                if i not in dicts:
                    dicts[i]=0
                dicts[i]+=1
        a = sorted(dicts.items(), key=lambda x:(-x[1],x[0]))
        res = []
        for i in a:
            res.append(i[0])
        print(''.join(res))
    except:
        break







可参考字典排序的知识
x:(-x[1],x[0]) 先按照字符的数量排序,当数量相等时,按照ASII码排序

发表于 2020-08-19 21:56:54 回复(0)
while True:
    try:
        a = input()
        s = set(a)
        d = {}
        r = ''
        for i in s:
            d[i] = a.count(i)
        t = sorted(d, key = lambda x: (d[x], -ord(str(x))), reverse=True)
        r = "".join(t)
        print(r)
    except:
        break
   
发表于 2020-08-13 15:07:09 回复(0)
while True:
    try:
        import heapq
        chars = input()
        dic = {}
        for char in chars:
            if char in dic:
                dic[char] +=1
            else:
                dic[char] = 1
        res,heap = "",[]
        for key in dic.keys():
            heapq.heappush(heap,(-dic[key],ord(key),key))
        while heap:
            a,b,c = heapq.heappop(heap)
            res += c
        print(res)
    except:
        break
先建字典,然后用多参数堆排
发表于 2020-07-30 22:45:37 回复(0)
while True:
    try:
        s = list(input())
        s2 = list(set(s))
        s2.sort()
        print("".join(sorted(s2, key=lambda x: -s.count(x))))
    except:
        break
Python简单易懂
发表于 2020-07-08 20:26:28 回复(0)
while True:
    try:
        s1=input()
        sr=[]
        for s in s1:
            sr.append(s)
        ls=[]
        count=[]
        while not sr==[]:
            i=sr[0]
            count.append(sr.count(i))
            ls.append(i)
            while i in sr:
                sr.remove(i)
        for i in ls:
            m=[ord(i)]
            for j in ls[ls.index(i)+1:]:
                if count[ls.index(i)]==count[ls.index(j)]:
                    m.append(ord(j))
            m.sort()
            q=0
            for k in m:
                count[ls.index(chr(k))]-=0.001*q
                q+=1
        counted=sorted(count,reverse=True)
        jg=[]
        # for i in counted:
        #     for j in range(int(i)):
        #         jg.append(count.index(i))
        for i in counted:
            jg.append(count.index(i))
        for i in jg:
            print(ls[i],end='')
    except:
        break
请问各位大神这个程序我在自己ide上面跑没问题,自测用力也没问题,为什么系统判断就是不对啊。
发表于 2020-06-28 17:13:55 回复(3)

while True:
    try:
        s = input()
        a = list(s)
        dit = {}
        for i in a:
            if i.isalpha()&nbs***bsp;i.isspace()&nbs***bsp;i.isdigit():
                if i in dit:
                    dit[i]+=1
                else:
                    dit[i]=1
            b = sorted(dit.items(),key = lambda x:x[1],reverse=True)
            ls = []
            for s,n in b:
                ls.append([s,n*256+256-ord(s)])#把值比较和码比较合并了,别的地方写的不好
            c = sorted(ls,key = lambda x:x[1],reverse=True)
            res = ''
            for i in c:
                res = res+i[0]
        print(res)
    except:
        break

发表于 2020-06-24 15:38:16 回复(0)
import re
while 1:
    try:
        instr, mylist = list(map(ord,list(input()))), []
        for i in instr:
            if (-instr.count(i), i) not in mylist:
                mylist.append((-instr.count(i), i))
        value  = [a[1] for a in sorted(mylist)]
        allstr = ''.join(list(map(chr, value)))
        out    = list(re.findall(r'[a-zA-Z0-9\s]',allstr))
        print(''.join(out))
    except:
        break
        
还是费了点功夫,用字符的ASCII值的负数和出现频率构成一个元组之后就可以按照题意利用sorted函数实现排序了,再利用re正则化就可以筛选需要统计的字符了。

发表于 2020-06-04 20:22:45 回复(0)