ACM_Scramble Sort
Scramble Sort
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
In this problem you will be given a series of lists containing both words and numbers. The goal is to sort these lists in such a way that all words are in alphabetical order and all numbers are in numerical order. Furthermore, if the nth element in the list is a number it must remain a number, and if it is a word it must remain a word.
译文:这个问题中,你会得到一系列包含单词和数字的列表。我们的目标是以这样一种方式对这些列表进行排序,以便所有单词按字母顺序排列,所有数字按数字顺序排列。此外,如果列表中的第n个元素是数字,它必须保留一个数字,如果它是一个单词,它必须保持一个单词。
Input:
The input will contain multiple lists, one per line. Each element of the list will be separated by a comma followed a space, and the list will be terminated by a period. The input will be terminated by a line containing only a single period.
译文:输入将包含多个列表,每行一个。列表中的每个元素将用空格分隔逗号,并且该列表将以句点结束。输入将以仅包含单个句点的行结束。
Output:
For each list in the input, output the scramble sorted list, separating each element of the list with a comma followed by a space, and ending the list with a period.
译文:对于输入中的每个列表,输出争用排序列表,用逗号分隔列表中的每个元素,后跟一个空格,并以句点结束列表。
Sample Input:
0.
banana, strawberry, OrAnGe.
Banana, StRaWbErRy, orange.
10, 8, 6, 4, 2, 0.
x, 30, -20, z, 1000, 1, Y.
50, 7, kitten, puppy, 2, orangutan, 52, -100, bird, worm, 7, beetle.
.
Sample Output:
0.
banana, OrAnGe, strawberry.
Banana, orange, StRaWbErRy.
0, 2, 4, 6, 8, 10.
x, -20, 1, Y, 30, 1000, z.
-100, 2, beetle, bird, 7, kitten, 7, 50, orangutan, puppy, 52, worm.
解题思路:字符串+排序。做这道题整整花了4个小时,(流下了没技术的眼泪QAQ)。回归正题,题目已经说得很清楚了,对一串字符串中的单词和数值分别进行排序,然后输出它们的字典序,但是要求原本是单词的位置现在输出还是单词,原来是数值的位置现在还是输出数值,注意输出每个子字符串后面有逗号和空格,当然句尾结束是点字符。刚开始想用C++解决,后来发现处理一些细节上比较繁琐(怪我没学精,打脸==+),于是用java一次AC了它。思路是这样子,先读取一整串字符串中以逗号分隔的子字符串的个数,用一个布尔数组来标记每个子字符串的位置是否是数值,是的话为true,否则(单词的话)为false,然后将单词保存在单词数组中,将数值保存在数值数组中;接下来进行排序,但是不能用Arrays.sort()排序两个数组,理由:①单词数组排序是忽略字母大小的,所以不能直接用库函数,而是采用s1.compareToIgnoreCase(s2)方法(返回值为int,如果s1>s2,返回对应字符ASCII的差值大于0;s1==s2,返回0;s1<s2,返回小于0的ASCII差值)来进行排序,这里都采用选择排序;②对数值数组的排序,刚开始直接用库函数进行排序,后面发现是错的,于是自己再写了一个选择排序,排序完剩下就更简单了,直接输出。写完这个担心输入的字符串长度很长,可能导致其中同一类型的数据过多,这样排序耗时会变长,但提交后显示128ms,说明选择排序可以过,而不必写快排!!!
AC代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
String str1=scan.nextLine();//读入字符串
while(!str1.equals(".")){
String str2=str1.substring(0, str1.length()-1);
String []str3=str2.split(", ");
int len=str3.length;
boolean []isdight=new boolean[len];//判断该位置上是数字的话为真值,其余默认假值
int []num=new int[len];//至少申请这么长的长度
String []word=new String[len];//用两个数组来分别保存单词和数字
int indexOfword1=0,indexOfnum1=0;
for(int i=0;i<len;++i){
if(Character.isLetter(str3[i].charAt(0))){
isdight[i]=false;
word[indexOfword1++]=str3[i];//如果第一个是字母的话就直接赋值给word数组
}
else{
isdight[i]=true;
num[indexOfnum1++]=Integer.parseInt(str3[i]);//否则转换成数值给num数组
}
}
//字符串单词排序代码
for(int i=0;i<indexOfword1-1;++i){
int k=i;
for(int j=i+1;j<indexOfword1;++j){
if(word[k].compareToIgnoreCase(word[j])>0)//升序排列
k=j;
}
if(k!=i){
String tmp=word[i];
word[i]=word[k];
word[k]=tmp;
}
}
//数值排序
for(int i=0;i<indexOfnum1-1;++i){
int k=i;
for(int j=i+1;j<indexOfnum1;++j)
if(num[k]>num[j])k=j;
if(k!=i){
int tmp=num[i];
num[i]=num[k];
num[k]=tmp;
}
}
//输出
int indexOfword2=0,indexOfnum2=0;
for(int i=0;i<len-1;++i){
if(isdight[i])System.out.print(num[indexOfnum2++]+", ");
else System.out.print(word[indexOfword2++]+", ");
}
if(isdight[len-1])System.out.println(num[indexOfnum2]+".");
else System.out.println(word[indexOfword2]+".");
str1=scan.nextLine();//读入下一个字符串
}
}
}
ACM_Scramble Sort的更多相关文章
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
- [算法]——快速排序(Quick Sort)
顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...
- shell之sort命令
1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [rocrocket@rocrocket progr ...
- 详细解说 STL 排序(Sort)
0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ...
- SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join
nested loops join(嵌套循环) 驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...
- js sort() reverse()
数组中存在的两个方法:sort()和reverse() 直接用sort(),如下: ,,,,,,,,,,,]; console.log(array.sort());ps:[0, 1, 2, 2, 29 ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- 2.sort 排序命令讲解
sort命令 sort:文本排序,仅仅是对显示文件的排序,而不影响源文件的顺序,是根据ASSII码 的字符升序来排列的. -n:安装数值大小从小到大排列 ,默认是升序. ...
- 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od
awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk '' | output 1.首先要知道形式 awk 'command' fi ...
随机推荐
- 杜教筛--51nod1239 欧拉函数之和
求$\sum_{i=1}^{n}\varphi (i)$,$n\leqslant 1e10$. 这里先把杜教筛的一般套路贴一下: 要求$S(n)=\sum_{i=1}^{n}f(i)$,而现在有一数论 ...
- [bzo1211][HNOI2004]树的计数_prufer序列
树的计数 bzoj-1211 HNOI-2004 题目大意:题目链接. 注释:略. 想法: prufer序列有一个性质就是一个数在prufer序列中出现的次数等于这个prufer序列生成的树中它的度数 ...
- [bzoj2443][Usaco2011 Open]奇数度数_树形dp_生成树_并查集
奇数度数 bzoj-2443 Usaco-2011 Open 题目大意:给定一个n个点m条便有向图,问是否有一种选出一些边的方式使得所有点的度数都是奇数. 注释:$1\le n \le 5\cdot ...
- 【Windows系统】-- 远程桌面时,WIN键被锁定
问题重现: 在对远程机器进行操作的时候,按键时会自动变成WIN组合键,比如:你按D的效果为[WIN+D]组合键的效果 就是切换到桌面,按E就是[WIN+E]组合键的效果,就是打开资源管理器. 解决方案 ...
- JFinal Weixin 微信极速 SDK
原文:https://git.oschina.net/jfinal/jfinal-weixin
- pkill有的时候并不能杀死进程?
pkill的用法:http://man.linuxde.net/pkill 根据进程命令行,杀死进程 如下intellij.go代码为一个代理服务器,把本地请求转向一个代理 package main ...
- AES加密算法的C++实现
摘要:作为新一代的加密标准,AES 旨在取代 DES(请看<DES加密算法的C++实现>),以适应当今分布式开放网络对数据加密安全性的要求.本文在分析了 AES 加密原理的基础上着重说明了 ...
- Jenkins安装与使用
一.Jenkins简介 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作 二.下载与安装 下载地址 ...
- 介绍Android拍照,录像开发的相关东东
Android下相机有自带的照片功能,可是作为开发人员,我们需要更为深层次的知道,怎么用,以及相关原理,这里我就这方面的学习,写一下心得,供博友参考. 第一种:调用系统自带相机界面. 这时我们在布局文 ...
- JPA測试实例
依赖架包 实体 import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.G ...