public class ReverseWords {
/**
* 题目:颠倒一个句子中的词的顺序。比如: I am a student颠倒后变成:student a am I.词以空格分隔。
* 要求:
* 1.实现速度最快,移动最少
* 2.不能使用String的方法如split,indexOf等等。
* 解答:两次翻转。
*/
public static void main(String[] args) {
String str=" ^busy living, or busy dying! $ ";
str=reverseWords(str);
System.out.println(str);
}
/*
Because we cannot use "String.split" to get each single word,
we use 'head' index and 'tail' index to find a word
Note that there're two cases in finding tail:
1.current char is not ' ' and next char is ' '
2.current char is the end of string
*/
public static String reverseWords(String str){
if(str==null){
return null;
}
int length;
if((length=str.length())==0 || length==1){
return str;
}
char[] letters=str.toCharArray();
int begin=-1;
int end=-1;
boolean hasBegined=false;
boolean hasEnded=false;
for(int i=0,len=str.length();i<len-1;i++){
if(letters[i]!=' '){
if(!hasBegined){
begin=i;
hasBegined=true;
}else{
if(letters[i+1]==' '){//case 1
end=i;
hasEnded=true;
}
if(i==len-2&&letters[i+1]!=' '){//case 2
end=i+1;
hasEnded=true;
}
if(hasEnded){
reverseOneWord(letters,begin,end);//reverse each single word
hasBegined=false;
hasEnded=false;
}
}
}
}
reverseOneWord(letters,0,str.length()-1);//reverse the whole string
return new String(letters,0,str.length());
}
//reverse a single word
public static void reverseOneWord(char[] letters,int begin,int end){
if(letters==null||letters.length<2){
return;
}
int len=letters.length;
if(begin>=0&&begin<len&&end>=0&&end<len){
while(begin<end){
/*swap solution 1
char tmp=letters[begin];
letters[begin]=letters[end];
letters[end]=tmp;
*/
//swap solution 2
letters[begin]^=letters[end];
letters[end]^=letters[begin];
letters[begin]^=letters[end];
begin++;
end--;
}
}
}
}
分享到:
相关推荐
限定词分为前位词、中位词和后位词,如倍数、分数放前,冠词居中,代词和物主代词放后。顺序为:前位-中位-后位。冠词分为定冠词(the)和零冠词,定冠词表示特指,零冠词用于专有名词、不可数名词等特定情况。 **...
字符串反转是指将一个字符串中的字符顺序颠倒,使得原本在后面的字符现在出现在前面。这里我们有两种实现方法: - 使用`System.Text.StringBuilder`类: ```csharp private string StrReverse(string str) { ...
- **`next`**:一个指向下一个`LNode`类型的指针,用于链接到链表中的下一个节点。 #### 功能实现 系统提供了多种功能来操作学生信息,包括创建链表、显示所有学生信息、查找最高分学生、反转链表、删除指定位置的...
该题目要求编写一个算法方法,根据typeKey获取所有相关的商品信息。我们使用迭代器遍历商品列表,并使用hasParentTypeKey()方法判断商品的类型是否是目标类型的子级类型,如果是则添加到结果列表中。
2. 关系数据库中的记录顺序是无关紧要的,前后顺序可以任意颠倒,不影响库中的数据关系。数据库会根据指定的键或索引来组织和检索数据,而不是记录的物理顺序。 3. 在公司部门和职员的关系中,职员与部门的联系类型...
例如,题目中给出了四个选项:A. consequently, B. continuously, C. constantly, D. consistently。这些词都有连续的意思,但具体含义有所不同。"consequently"意为"因此,所以","continuously"指"不间断地",...
其他选项的顺序错误:A选项的asc是升序,且where子句应在order by之前;C选项的desc和order语法错误;D选项的desc和order位置颠倒。 132. 正确的选择SQL命令是 `select 专业, count(*) from student group by 专业`...
ELEMENT student (id, name, score)>表示学生元素包含学号和姓名元素,顺序不能颠倒,且每个学生都有一个分数。 - 可以添加属性定义,如<!ATTLIST student id ID #REQUIRED>表示学生元素有一个id属性,是ID类型,且...
11. 关系数据库记录顺序:关系数据库文件中的记录顺序可以任意颠倒,不影响数据关系,因为记录的顺序并不重要,关键在于记录的键值。 12. 显示汉字:在显示或打印汉字时,系统使用的是汉字的字形码,也就是用于屏幕...
在这个题目中,`struct student`定义了一个包含学号、姓名和成绩的结构体。结构体数组可以用来存储多个学生的信息。 - `strcmp`函数是C语言中的字符串比较函数,用于比较两个字符串的字典顺序。在给定的代码中,`...
4. 关系数据库记录:数据库文件中的记录顺序是可以任意颠倒的,不影响数据之间的关系。 5. 标准输入输出流:在编程中,System.In和System.Out是标准输入输出流,InputStream和OutputStream则是Java中的输入输出流类...
这里定义了一个结构体student,包含姓名、学号和成绩数组,然后输入10个学生的信息,计算平均成绩并输出。 这些习题覆盖了C++编程的基础知识,包括输入输出、条件判断、循环、数组、指针、结构体、数学运算等,对于...
1. 如果句中有be动词(am, is, are),将其提前到句首,第一人称变为第二人称,如 "Is this a book?" 或 "Are you a student?" 2. 当动词是"have"时,添加助动词"do"(主语非第三人称单数)或"does"(主语是第三...
在实际考试中,可能会要求读取外部文件(如`in.dat`)中的数据,然后将结果写入另一个文件(如`out.dat`)。这通常涉及文件操作,例如使用`fopen`打开文件,`fscanf`或`fgets`读取数据,以及`fprintf`或`fwrite`写入...
语言点讲解中,介绍了与艺术相关的词汇扩展,如**art student**、**art gallery**、**artist**、**artiste**,以及**criticise**、**criticism**、**critical**、**critically**,这些词展示了艺术评论的层次和态度...
本资源是一个教育类的试题集,内容涵盖了《中华歌谣100首》的主要知识点,包括填空题、判断题等形式。下面是对试题的详细解释和知识点的总结: 一、填空题 1. 《中华歌谣100首》分为五个部分,包括(歌谣、故事、...