华为OD2023机试真题【字符串重新排序】

华为OD2023机试真题,全题库点这里

题目名称字符串重新排序
知识点排序数组
时间限制1s
空间限制256M
 **题目描述:**
 给定一个字符串s,s包含以空格分隔的若干单词,请对s进行如下处理后输出

 1. 单词内部调整:对每个单词字母重新按照字典顺序排列;
 2. 单词间顺序调整:
 	1)统计每个单词出现的次数
 	2)次数相同时,按单词长度升序排列
 	3)次数和单词长度均相同时,按字典序升序排列
 请输出处理后的字符串,每个单词以一个空格分隔
 **输入描述:**
  一行字符串,每个字符取值范围:【a-zA-z0-9】以及空格,字符串长度范围:【1,1000】
 **输出描述:**
重新排序后的字符串,每个单词间隔1个空格,且首尾无空格
示例:
输入:
This is an apple
输出:
an is This aelpp
解题思路
直接两步排序
# coding:utf-8

import functools

# 处理输入
input_str = input()
input_list = input_str.split(" ")

# 第一步,单词内部调整
new_list = []
for single_str in input_list:
    new_list.append("".join(sorted(single_str, reverse=False)))


# 自定义排序函数,a,b为(str,count)
def comp(a, b):
    if (a[1] > b[1]):
        return -1
    elif (a[1] == b[1]):
        if (len(a[0]) > len(b[0])):
            return 1
        elif (len(a[0]) == len(b[0])):
            if (a[0] > b[0]):
                return 1
            else:
                return -1
        else:
            return -1
    else:
        return 1


# 第二步,单词间调整
# 先统计每个单词出现的次数
str_count = {}
for single_str in new_list:
    if single_str in str_count:
        str_count[single_str] += 1
    else:
        str_count[single_str] = 1
print(str_count)

list1 = sorted(str_count.items(), key=functools.cmp_to_key(comp))

res_str = ""
for item in list1:
    for i in range(item[1]):
        res_str += item[0] + " "
print(res_str)
菜鸟的解法
# coding:utf-8
# 处理输入
input_str = input("请输入字符串:")
input_list = input_str.split(" ")

# 第一步,单个单词内调整
new_list = []
for single_str in input_list:
    new_list.append("".join(sorted(single_str, reverse=False)))


# 第二步,单词间调整
# 先统计每个单词出现的次数,存入字典内
str_count = {}
for single_str in new_list:
    if single_str in str_count:
        str_count[single_str] += 1
    else:
        str_count[single_str] = 1

#遍历字典内容,先按出现次数排序,然后再根据相同次数去判断单词长度
dict = sorted(str_count.items())
#冒泡排序
def sortdict(dict):
    for i in range(len(dict)):
        for j in range(i + 1, len(dict)):
            # 如果长度比后面的小,进行替换
            if int(dict[i][1]) < int(dict[j][1]):
                dict[i], dict[j] = dict[j], dict[i]
            # 如果单词出现次数相等,再进行单词长度的判断
            if int(dict[i][1]) == int(dict[j][1]):
                if len(dict[i][0]) > len(dict[j][0]):
                    dict[i], dict[j] = dict[j], dict[i]
                # 单词长度相等再进行判断
                elif len(dict[i][0]) == len(dict[j][0]):
                    if dict[i][0] > dict[j][0]:
                        dict[i], dict[j] = dict[j], dict[i]
    return dict
dict = sortdict(dict)
print(dict)
for i in dict:
    for j in range(i[1]):
        print(i[0],end=" ")

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值