我试图扭转字符串中的单词。考虑一个字符串'我的名字是abc'。预期的输出应该是'cba si eman yM'。但我得到的输出是'cba si emanyM'。最后的空白字符有问题。有人能帮助我吗?
我试图从最后反转字符串 这是代码
void reverse(String str)
{
int i = str.length() - 1;
char[] arr = str.toCharArray();
for(int j = arr.length - 1; j > 0; j--){
if(arr[j] == ' '){
swap(arr,i, j);
i = j - 1;
}
}
System.out.println( new String(arr).toString());
}
void swap(char[] s,int start, int end){
while(start > end){
char temp = s[start];
s[start] = s[end];
s[end] = temp;
start --;
end++;
}
}
public static void main(String args[])
{
String str = "My name is abc";
ReversWords r = new ReversWords();
r.reverse(str);
}
答案 0 :(得分:1)
正如我在评论中所说,您想要的样本输出:
cba si eman yM
建议您不要反转每个单词,只需反转整个字符串。
但是,我们假设这是错误的,并且正如您的标题所示,您想要反转每个单词中的字母,将单词保留为原始顺序,因此您想要的输出是:
yM eman si cba
当我运行你的代码时,我得到的输出是:
Myeman si cba
主要问题是,只有在前面有空格时才会翻转单词。第一个单词的测试失败了。在reverse
中,退出循环后,您需要在打印结果之前从0到i
进行交换。
你还有一个问题,就是空格最终会在交换单词的尾端结束,这就是为什么“我的”和“名字”之间的空格似乎已经消失了。换句话说,如果您在每个空格的位置打印“_”,则当前代码的输出为:
Myeman_si_cba _
要解决此问题,请在拨打swap
时不要包含空格。 reverse
方法应如下所示:
void reverse(String str) {
int i = str.length() - 1;
char[] arr = str.toCharArray();
for(int j = arr.length - 2; j > 0; j--){
if(arr[j] == ' '){
swap(arr,i, j + 1);
i = j - 1;
}
}
swap(arr, i, 0);
System.out.println( new String(arr).toString());
}
输出:
yM eman si cba
答案 1 :(得分:1)
你刚刚完成了这个
String s = "My name is abc";
StringBuffer sb = new StringBuffer(s);
sb.reverse();
System.out.println(sb.toString());
输出:cba si eman yM
答案 2 :(得分:0)
您无需检查任何内容。你可以盲目地反转一个字符串。
以下是static
功能的示例:
class StringReverseTest
{
static void reverse( final String str )
{
char[] arr = str.toCharArray();
final int len = arr.length;
for ( int i = 0, j = len - 1 ; i < len/2 ; i++, j-- )
{
final char temp = arr[ i ];
arr[ i ] = arr[ j ];
arr[ j ] = temp;
}
System.out.println( new String( arr ).toString() );
}
public static void main ( String[] args )
{
final String str1 = "My name is abc";
reverse( str1 );
final String str2 = "This is a string reverse test!";
reverse( str2 );
}
}
<强>输出:强>
cba si eman yM
!tset esrever gnirts a si sihT
以下是实例:http://ideone.com/f6ut7f
答案 3 :(得分:0)
只需删除这些不需要的条件并将其设为simple:
import { Component, OnInit } from '@angular/core';
import { Http } from '@angular/http';
import { NetworkService } from './../services/network.service';
import { Subject } from 'rxjs/Rx';
import { Router } from '@angular/router';
import { DataTableDirective } from 'angular-datatables';
@Component({
selector: 'app-namedetails',
templateUrl: './namedetails.component.html',
styleUrls: ['./namedetails.component.css']
})
export class NameDetails implements OnInit {
@ViewChild("myTable") myTable:DataTableDirective;
private nameList: any;
private selectedName:string;
private retrievedNames: any;
dtTrigger: Subject<any> = new Subject();
dtElement: DataTableDirective;
dtOptions: DataTables.Settings = {};
constructor(private _http:Http, private networkservice : NetworkService,private router: Router) {
}
ngOnInit() {
this.fetchFirstNames();
}
fetchFirstNames(){
this.networkservice.getAllFirstNames()
.subscribe(
res => {
console.log(res);
this.nameList = res;
});
}
fetchAllDetails(){
this.networkservice.getAllNames(this.selectedName)
.subscribe(
res => {
console.log(res);
this.retrievedNames = res;
this.myTable.dtInstance.then((dtInstance: DataTables.Api) => {
// Destroy the table first
dtInstance.destroy();
// Call the dtTrigger to rerender again
this.dtTrigger.next();
});
});
}
getData(){
this.fetchAllDetails();
}
}