当前位置: 首页 > news >正文

HJ26 字符串排序 ●●

HJ26 字符串排序 ●●

描述

编写一个程序,将输入字符串中的字符按如下规则排序。

规则 1 :英文字母从 A 到 Z 排列,不区分大小写。

如,输入: Type 输出: epTy

规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。

如,输入: BabA 输出: aABb

规则 3 :非英文字母的其它字符保持原来的位置。

如,输入: By?e 输出: Be?y

数据范围:输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000

输入描述:

输入字符串

输出描述:

输出字符串

示例

输入:A Famous Saying: Much Ado About Nothing (2012/8).
输出:A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).

题解

1. 桶排序

统计26个字母的出现顺序,并进行遍历填充。
时间复杂度:O(n)
空间复杂度:O(1)

#include <iostream>
#include <string>
#include <vector>
using namespace std;

bool isLetter(char ch){
    return toupper(ch) <= 'Z' && toupper(ch) >= 'A';
}

void bucketSort(string& str){
    vector<string> buckets(26, "");
    for(char ch : str){
        if(isLetter(ch)){
            buckets[toupper(ch)-'A'].push_back(ch);		// 对26个字母进行记录,有相对顺序
        }
    }
    int str_idx = 0, buck_idx = 0, num_idx = 0;
    while(str_idx < str.length()){
        if(isLetter(str[str_idx])){
            if(buck_idx < buckets[num_idx].size()){		// 填充当前字母
                str[str_idx++] = buckets[num_idx][buck_idx++];	
            }else{				// 当前字母遍历填充完成,跳到下一个字母
                buck_idx = 0;
                ++num_idx;		
            }
        }else{
            ++str_idx;			// 非字母位置,跳过
        }
    }    
}

int main(){
    string str;
    getline(cin, str);
    bucketSort(str);
    cout << str;
    return 0;
}

2. 归并排序

归并排序思想,对非字母的位置进行判断跳过,
nlogn复杂度,需要额外空间,数据大时递归超时。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

bool isLetter(char ch){
    return toupper(ch) <= 'Z' && toupper(ch) >= 'A';
}

void mergeSort(string& str, string& sorted, int start, int end){
    if(start >= end) return;
    int mid = start + (end - start) / 2;
    mergeSort(str, sorted, start, mid);
    mergeSort(str, sorted, mid+1, end);
    int left = start, right = mid+1;
    int idx = start;
    while(idx <= end){
        if(isLetter(str[left]) == false){
            ++left;
        }else if(isLetter(str[right]) == false){
            ++right;
        }else if(isLetter(str[idx]) == false){
            ++idx;
        }else if(left > mid){
            sorted[idx++] = str[right++];
        }else if(right > end){
            sorted[idx++] = str[left++];
        }else if(toupper(str[left]) > toupper(str[right])){
            sorted[idx++] = str[right++];
        }else if(toupper(str[left]) < toupper(str[right])){
            sorted[idx++] = str[left++];
        }else{
            sorted[idx++] = str[left++];
        }
    }
    for(int i = start; i <= end; ++i) str[i] = sorted[i];
}

int main(){
    string str;
    getline(cin, str);
    string sorted = str;
    mergeSort(str, sorted, 0, str.length()-1);
    cout << str;
    return 0;
}

相关文章:

  • Java程序员毕业N年系列----毕业二年
  • 抖音小程序模板全行业整理合集,抖音小程序制作平台分享
  • 嘉立创EDA专业版--彩色丝印?启用
  • 获评中国教育照明25强,利尔达引领教育照明行业“智变”
  • 武汉星起航:亚马逊卖家订单进入旺季迎猛涨,旺季如约而至
  • 刘亦菲生日当天,引发了我对正则的思考
  • Tomcat - 从源码阅读中分析核心组件
  • Android Glide应用中遇到问题
  • 个人云服务的搭建(折腾)之旅
  • 浅谈js中的深拷贝和浅拷贝
  • Hbase-3-4-Hbase读写数据流程
  • Oracle——常用的几种函数(含案例)
  • 【Linux】多线程 —— 线程概念 | 线程控制
  • windows10创建ssh git gitee使用公钥私钥【自留收藏】
  • 微信搜题接口API功能
  • 【知识碎片】第三方登录弹窗效果
  • CEF与代理
  • javascript 哈希表
  • JavaScript 奇技淫巧
  • mysql 数据库四种事务隔离级别
  • SQLServer插入数据
  • SQLServer之索引简介
  • Travix是如何部署应用程序到Kubernetes上的
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • XML已死 ?
  • 使用权重正则化较少模型过拟合
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 进程与线程(三)——进程/线程间通信
  • (10)ATF MMU转换表
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (区间dp) (经典例题) 石子合并
  • (已解决)什么是vue导航守卫
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net MVC中使用angularJs刷新页面数据列表
  • .net(C#)中String.Format如何使用
  • @AutoConfigurationPackage的使用
  • [22]. 括号生成
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [c语言]小课堂 day2
  • [hdu 3746] Cyclic Nacklace [kmp]
  • [hdu4622 Reincarnation]后缀数组
  • [Hive] CTE 通用表达式 WITH关键字
  • [LeetCode]—Implement strStr() 寻找子串匹配第一个位置 (KMP)
  • [ListView.View=List]的垂直滚动条
  • [MongoDB]------windos下的安装部署与基础使用
  • [PHP] 面向对象
  • [PTP][1588v2] Delay_Resp消息
  • [python]python os模块 常用命令
  • [Redis实战]分布式锁-redission
  • [VSCode] 自定义选中代码的高亮颜色
  • [安卓] 15、用NFC解锁手机并自动打开应用
  • [毕业设计源代码]精品基于SSM的线上点餐系统[包运行成功]