大小写字母和数字按字典排序

  • 问题

问题

一、请对一组字符串进行排序,字符串由大小写字母和数字组成,需要满足以下比较规则:
1、长度不同时,长度较短在排前面;
2、长度相同时,按照字典顺序排列(AaBb - Zz,0-9顺序),即大写字母在小写字母前,数字排在字母后。
具体例子:
输入:

abc Abc 123 11bc CBD abcd a

排序后结果为:

a 1 Abc abc CBD 1bc 123 abcd

要求时间复杂度为:

O(nlogn)


Code

//c++
#include <iostream>
#include <string>
#include <vector>
#include <map>using namespace std;void sortAsSize(std::vector<string> &stri)
{for (int i = 0; i < stri.size(); i++){for (int j = 0; j < stri.size() - i - 1; j++){int t_int = 0;string t_str;if (stri.at(j).size() > stri.at(j + 1).size()){t_str = stri.at(j);stri.at(j) = stri.at(j + 1);stri.at(j + 1) = t_str;}}}
}void sortAsChar(std::vector<string> &ss, int pos)
{std::vector<string> st = ss;int strsize = st.at(0).size();ss.clear();string Astr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";string astr = "abcdefghijklmnopqrstuvwxyz";string nstr = "0123456789";std::vector<string>::iterator it;for (int i = 0; i < Astr.size(); ++i)  //for AcBbCc........{int locals = 0;std::vector<string> tt;for (int j = 0; j < st.size(); ++j){if(st.at(j).at(pos) == Astr[i]){tt.push_back(st.at(j));locals ++;}}if(locals > 1 && pos < strsize - 1){sortAsChar(tt, pos + 1);}for (it = tt.begin(); it != tt.end(); it++){ss.push_back(*it);}locals = 0;tt.clear();for (int k = 0; k < st.size(); ++k){if(st.at(k).at(pos) == astr[i]){tt.push_back(st.at(k));locals++;}}if(locals > 1 && pos < strsize - 1){sortAsChar(tt, pos + 1);}for (it = tt.begin(); it != tt.end(); it++){ss.push_back(*it);}}for (int m = 0; m < nstr.size(); ++m)  //for 01234....{int locals = 0;std::vector<string> tt;tt.clear();for (int l = 0; l < st.size(); ++l){if(st.at(l).at(pos) == nstr[m]){tt.push_back(st.at(l));locals++;}}if(locals > 1 && pos < strsize - 1){sortAsChar(tt, pos + 1);}for (it = tt.begin(); it != tt.end(); it++){ss.push_back(*it);}}
}int main()
{string strcin;while(getline(cin,strcin))   //abc Abc 123 1 1bc CBD abcd a  //abc Abc 123 1bc CBD{string temps ;string str ;std::vector<string> strs;std::vector<string> strt;std::vector<std::vector<string>> sss;std::vector<std::vector<string>> sst;std::vector<string>::iterator it;std::vector<std::vector<string>>::iterator its;str = strcin + ' ';for (int k = 0; k < str.size(); k++){char tc = str[k];if(tc != ' '){temps.push_back(tc);} else{strs.push_back(temps);temps.clear();}}sortAsSize(strs);   //sort as size of stringcout << "\ncounts of string = " << strs.size() << endl<<endl;    //debug onlyfor (it = strs.begin(); it != strs.end(); it++){cout << *it << "鈥?" << (*it).size() <<")\t";    //debug only}cout<<endl;for (it = strs.begin(); it != strs.end(); it++){if(it == strs.begin()){strt.push_back(*it);}else if(it == (strs.end() - 1)){if((*it).size() == (*(it - 1)).size()){strt.push_back(*it);sss.push_back(strt);} else{sss.push_back(strt);strt.clear();strt.push_back(*it);sss.push_back(strt);strt.clear();}}else{if((*it).size() == (*(it - 1)).size()){strt.push_back(*it);} else{sss.push_back(strt);strt.clear();strt.push_back(*it);}}}sst.clear();for (its = sss.begin(); its != sss.end(); its++){strt.clear();strt = *its;sortAsChar(strt,0);sst.push_back(strt);}str.clear();for (its = sst.begin(); its != sst.end(); its++){for (it = (*its).begin(); it != (*its).end(); it++){if(its == (sst.end() - 1) && it == ((*its).end() - 1)){str += *it;}else{str += *it + ' ';}}}cout<<endl;cout << str << endl;}return 0;
}

大小写字母和数字按字典排序相关推荐

  1. python编程实战(二):一文教你生成随机验证码!大小写字母与数字组合,位数可以控制

    随机验证码的生成 前言 正文 实现 代码 效果 前言 验证码验证,是常见的安全验证的一种方式,可以用来杜绝脚本和机器人操作等等: 除了本文介绍的简单的验证码之外,还有拼图验证.文字顺序验证等常见的验证 ...

  2. Java 判断密码是否是大小写字母、数字、特殊字符中的至少三种

    Java 判断密码是否是大小写字母.数字.特殊字符中的至少三种public class CheckPassword {//数字public static final String REG_NUMBER ...

  3. php统计大写字母个数,C++_C++统计中英文大小写字母、数字、空格及其他字符个数的方法,本文实例讲述了C++统计中英文 - phpStudy...

    C++统计中英文大小写字母.数字.空格及其他字符个数的方法 本文实例讲述了C++统计中英文大小写字母.数字.空格及其他字符个数的方法.分享给大家供大家参考,具体如下: /* * 作 者: 刘同宾 * ...

  4. 正则表达式:密码必须为8~16位非空字符,并包含大小写字母、数字、特殊字符

    正则const pwpattent = /^(?!.\s)(?=.[A-Z])(?=.[a-z])(?=.[0-9])(?=.*[\W_]).{8,16}$/; <el-form :model= ...

  5. 生成10位由大小写字母和数字组成的随机激活码

    生成10位由大小写字母和数字组成的随机激活码 /* select char(65+ceiling(rand()*25)) --随机字母(大写) select char(97+ceiling(rand( ...

  6. c语言随机产生大小写字母,c# 产生随机字符串,包括大小写字母和数字

    #region MyRegion //產生密碼 protected static string GetPwd() { return CreateRandomNum123(2) + CreateRand ...

  7. java正则校验-密码至少要由包括大小写字母、数字、标点符号的其中两项,共计8-16位编码组成

    很多朋友在问正则组合校验的问题,但网上那些大都是不对的,现贴上我在项目中写的部分源码供大家取用. String regex = "^(?![A-Za-z]+$)(?!\\d+$)(?![\\ ...

  8. formValidator正则校验密码大小写字母加数字

    RegexValidator:   属性 属性名称 默认值 详细解释 regexp 正则表达式 "" 采用的是显式构造函数new RegExp("pattern" ...

  9. 正则表达式生成随机密码包含大小写字母、数字和特殊字符

    密码 //必须包含大小写字母.数字和特殊字符 String regex = "^(?=.*[A-Z])(?=.*[a-z])(?![0-9]+$)(?![^0-9]+$)(?![a-zA-Z ...

  10. 任意长度密码(密码可输入大小写字母 和 数字)的加密与解密

    密码的加密:  输入一串任意长度的密码可包含大小写字母和数字  加密规则如下:  每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和最后位交换,第二位和倒数第二位交换....输入一个未加 ...

最新文章

  1. Android获取状态栏的高度:
  2. apache 与 php-fpm 几种处理方式
  3. jsp页面间的传值方法
  4. windows中遍历指定文件夹下的所有子文件夹
  5. 微信开发基础 获取用户OpenID 列表
  6. spring框架中@PostConstruct的实现原理
  7. 学习Machine Leaning In Action(四):逻辑回归
  8. The valid characters are defined in RFC 7230 and RFC 3986-Tomcat解决方案
  9. Flex导出Excel
  10. 实验3-10 高速公路超速处罚 (15 分)
  11. 从二进制数据流中构造GDAL可以读取的图像数据(C#)
  12. cookie helper.php,CookieHelper cook crud 工具类
  13. 第二章 第七课 Scratch作品:神奇的小猫(脚本块:外观)
  14. 通过DMA方式进行连续发送
  15. halcon获取图像中心点_Halcon学习之六:获取Image图像中Region区域的特征参数
  16. 获取windows程序界面数据
  17. 快递到付被拒收怎么办?双方都拒收货物会怎么处理?
  18. sn0int - 半自动化 OSINT 框架和包管理器
  19. 经典古诗词名句 mysql,中国古代经典古诗词名句
  20. 原生Android设置sim卡锁定,如何为更安全的Android手机设置SIM卡锁 | MOS86

热门文章

  1. 【空心杯四旋翼TinyLeaf】姿态控制入门
  2. Scope Hosting的特点及使用
  3. 【原创】centos7 64位 安装rar和unrar
  4. FFmpeg/opencv + C++ 实现直播拉流和直播推流(对视频帧进行处理)
  5. 嵌入式软件和C/C++面经汇总
  6. 【AI视野·今日Sound 声学论文速览 第二十一期】Mon, 9 Oct 2023
  7. 超强Java进阶路线知识图谱:java开发去国企和私企
  8. 一样都是人体传感器,为何价格会差几倍?
  9. 精准赋能独角兽企业信息化建设的低代码
  10. UE4 Swamp 4.14-4.21 – 树木和灌木丛资源