如何在Java中交换字符串的第一个和最后一个字符?

我在夏天练习尝试变得更好,我对以下内容有点困惑:

http://www.javabat.com/prob/p123384

给定一个字符串,返回一个新的字符串,其中第一个和最后一个字符已被交换。


例子:

frontBack("code") → "eodc" frontBack("a") → "a" frontBack("ab") → "ba" 

码:

 public String frontBack(String str) { String aString = ""; if (str.length() == 0){ return ""; } char beginning = str.charAt(0); char end = str.charAt(str.length() - 1); str.replace(beginning, end); str.replace(end, beginning); return str; } 

我建议使用String.substring方法来获取排除第一个和最后一个字母的字符,然后连接beginning字符和end字符,而不是使用String.replace方法。

此外, String.replace方法将替换所有出现的指定字符,并返回带有所述替换的新String 。 由于在上面的代码中没有获取返回,因此String.replace调用在这里做的并不多。

这是因为Java中的String是不可变的,因此, replace方法不能对原始String进行任何更改,在这种情况下,这是str变量。


另外,对于长度为1的String ,这种方法不能很好地工作。使用上面的方法,使用长度为1的源String调用String.substring将导致StringIndexOutOfBoundsException ,这样也会如果采取上述方法,则必须作为特殊情况予以处理。

坦率地说,这个方法在indyK1ng的答案中提出,其中char[]是从String并执行开头和结尾字符的简单交换,然后从修改后的char[]创建一个String开始听起来更令人愉快。

字符串可以分成一组字符,可以使用字符数组。 有关String对象的更多详细信息,请转至Java API并单击左下方窗格中的String。 该窗格按字母顺序排序。

编辑:由于有些人更加彻底,我想我会提供更多细节。 使用String的.toCharArray()方法创建一个char数组。 获取第一个元素并将其存储在char中,将第一个元素与最后一个元素交换,并将存储在char中的元素放入数组的最后一个元素中,然后说:

 String temp = new String(charArray); 

并返回。 这假设charArray是你的字符数组。

Java中的String实例是不可变的。 这意味着您无法更改String中的String ; 不同的字符序列需要一个新对象。 因此,当您使用replace方法时,请丢弃原始字符串,并使用该方法的结果。

但是,对于此方法,您可能希望将String实例转换为可变的字符数组( char[] )。 交换所需的字符后,使用该数组创建一个新的String实例。

一些提示:

  • 字符串是不可变的,这意味着它们不能被更改。 因此, str.replace()不会更改str ,而是返回一个新字符串。

  • 也许replace不是最好的…考虑frontBack("abcabc") :你的函数,如果它被纠正,将用'c'替换'a' 'c'产生"cbccbc" ,然后'c''a'产生"abaaba" 。 那不太对!

Stringreplace方法实际上返回一个String ,所以如果你坚持使用replace ,你会做:

 beginReplace = str.replace( beginning, end ); endReplace = beginReplace.replace( end, beginning ); return( str ); 

但这实际上并不能解决您的具体问题,因为replace替换字符串中字符的所有出现

例如,如果我的字符串是“apple”而我说“apple”.replace(’p’,’q’),结果字符串将是“aqqle”。

另一个例子没有创建其他对象

 if (str.length() > 1) { char[] chars = str.toCharArray(); // replace with swap() char first = chars[0]; chars[0] = chars[chars.length - 1]; chars[chars.length - 1] = first; str = new String(chars); } return str; 

编辑:执行swap = length = 1字符串是no-op。

编辑2: dfa对copyValueOf的更改没有任何意义,因为Java源代码在String.java中说:“//所有公共String构造函数现在都复制数据。” 并且调用只是委托给字符串构造函数。

你可以使用正则表达式..

 return str.replaceFirst("(.)(.*)(.)", "$3$2$1"); 

只是另一种略有不同的方法,让您了解各种可能性。 我建议你注意快速退出短字符串(而不是在if()子句中嵌套更复杂的处理),以及使用String.format(),因为它是你工具箱中的一种方便的技巧,并不是因为它在这个特定的例子中明显优于常规的“+”连接。

 public static String exchange(String s) { int n = s.length(); if (n < 2) return s; return String.format("%s%s%s", s.charAt(n - 1), s.substring(1, n - 1), s.charAt(0)); } 

简单的解决方案是

 public String frontBack(String str) { if (str == null || str.length() == 0) { return str; } char[] cs = str.toCharArray(); char first = cs[0]; cs[0] = cs[cs.length -1]; cs[cs.length -1] = first; return new String(cs); } 

使用字符数组(注意讨厌的空String或null String参数!)


另一个解决方案使用StringBuilder(它通常用于执行String manupilation,因为String本身是不可变的。

 public String frontBack(String str) { if (str == null || str.length() == 0) { return str; } StringBuilder sb = new StringBuilder(str); char first = sb.charAt(0); sb.setCharAt(0, sb.charAt(sb.length()-1)); sb.setCharAt(sb.length()-1, first); return sb.toString(); } 

另一种方法(指令比实际使用更多)是这样的:

 public String frontBack(String str) { if (str == null || str.length() < 2) { return str; } StringBuilder sb = new StringBuilder(str); String sub = sb.substring(1, sb.length() -1); return sb.reverse().replace(1, sb.length() -1, sub).toString(); } 

这里完整的字符串被反转,然后不应该被反转的部分被子字符串替换。 ;)

 if (s.length < 2) { return s; } return s.subString(s.length - 1) + s.subString(1, s.length - 2) + s.subString(0, 1); 

(未经测试,索引可能是一个...

 public String frontBack(String input) { return input.substring(input.length() - 1) + // The last character input.substring(1, input.length() - 1) + // plus the middle part input.substring(0, 1); // plus the first character. } 

您可以使用表示“可变字符序列”的StringBuilder。
它具有解决问题所需的所有方法:charAt,setCharAt,length和toString。

 public String lastChars(String a, String b) { if(a.length()>=1&&b.length()>=1){ String str = a.substring(0,1); String str1 =b.substring(b.length()-1); return str+str1; } else if(a.length()==0&&b.length()==0){ String v ="@"; String z ="@"; return v+z; } else if(a.length()==0&&b.length()>=1){ String s ="@"; String s1 = b.substring(b.length()-1); return s+s1; } else if(a.length()>=1&&b.length()==0){ String f= a.substring(0,1); String h = "@"; return f+h; } return a; } 

您可以使用此代码:

 public String frontBack(String str) { if (str.length() <= 1) return str; String mid = str.substring(1, str.length()-1); // last + mid + first return str.charAt(str.length()-1) + mid + str.charAt(0); } 
 class swap { public static void main(String[] args) { Scanner s=new Scanner(System.in); System.out.println("no of elements in array"); int n=s.nextInt(); int a[]=new int[n]; System.out.println("Elements"); for(int i=0;i 
 if (str.length() <= 1) { return str; } String mid = str.substring(1, str.length()-1); return str.charAt(str.length()-1) + mid + str.charAt(0); 
  function frontBack(str: string) { return str.slice(str.length - 1) + str.slice(1, -1) + str.slice(0, 1) } 

切片将“切掉”最后一个字母。 计算字符串的长度str.length -1 ,(加)提醒切片字符串,从索引1开始,是在索引-1处表示的最后一个字符,(加号)切片在索引0到的最后一个字母指数1。