我在夏天练习尝试变得更好,我对以下内容感到困惑:
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;
}
答案 0 :(得分:9)
字符串可以拆分为字符数组,可以使用字符数组。有关String对象的更多详细信息,请转到Java API并单击左下方窗格中的String。该窗格按字母顺序排序。
编辑:由于有些人更加彻底,我想我会提供更多细节。使用String的.toCharArray()方法创建一个char数组。取第一个元素并将其存储在char中,将第一个元素与最后一个元素交换,然后将存储在char中的元素放入数组的最后一个元素中,然后说:
String temp = new String(charArray);
并返回。这假设charArray是你的字符数组。
答案 1 :(得分:7)
我建议使用String.replace
方法获取排除第一个和最后一个字母的字符,然后连接beginning
和{{1},而不是使用String.substring
方法。 } characters。
此外,end
方法将替换所有出现的指定字符,并返回带有所述替换的新String.replace
。由于上面的代码中没有提到退货,String
来电在这里做的确不多。
这是因为Java中的String.replace
是不可变的,因此String
方法无法对原replace
进行任何更改,在这种情况下String
变量
另外,对于长度为1的str
,此方法效果不佳。使用上述方法,调用源String
的{{1}}长度为1将导致String.substring
,因此如果采取上述方法,也必须将其作为特殊情况处理。
坦率地说,indyK1ng's answer中提供的方法,其中String
从StringIndexOutOfBoundsException
获得,并执行开头和结尾字符的简单交换,然后生成char[]
来自修改后的String
开始听起来更加愉快。
答案 2 :(得分:4)
String
个实例是不可变的。这意味着您无法更改String
中的字符;不同的字符序列需要一个新对象。因此,当您使用replace
方法时,请丢弃原始字符串,然后使用该方法的结果。
但是,对于此方法,您可能希望将String
实例转换为可变的字符数组(char[]
)。在交换所需的字符后,使用该数组创建一个新的String
实例。
答案 3 :(得分:2)
一些提示:
字符串是不可变的,这意味着它们无法更改。因此,str.replace()
不会更改str
,而是会返回一个新字符串。
可能replace
不是最好的...考虑frontBack("abcabc")
:您的函数如果已更正,则会将'a'
替换为'c'
,并产生{{} {1}},然后"cbccbc"
'c'
屈服'a'
。那不太对劲!
答案 4 :(得分:2)
replace
中的String
方法实际上会返回String
,因此如果您坚持使用replace
,则可以执行以下操作:
beginReplace = str.replace( beginning, end );
endReplace = beginReplace.replace( end, beginning );
return( str );
但这实际上无法解决您的特定问题,因为replace
会替换字符串中字符的所有出现次数并替换它。
例如,如果我的字符串是“apple”而我说“apple”.replace('p','q'),结果字符串将是“aqqle”。
答案 5 :(得分:2)
又一个例子 ,没有创建其他对象 :
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构造函数现在都复制数据。”并且调用只是委托给字符串构造函数。
答案 6 :(得分:2)
你可以使用正则表达式..
return str.replaceFirst("(.)(.*)(.)", "$3$2$1");
答案 7 :(得分: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));
}
答案 8 :(得分:1)
简单的解决方案是:
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();
}
这里反转完整的字符串,然后用子字符串替换不应该反转的部分。 ;)
答案 9 :(得分:0)
if (s.length < 2) {
return s;
}
return s.subString(s.length - 1) + s.subString(1, s.length - 2) + s.subString(0, 1);
(未经测试,索引可能是一个......
答案 10 :(得分:0)
您可以使用此代码:
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);
}
答案 11 :(得分:0)
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;
}
答案 12 :(得分:0)
您可以使用表示“可变字符序列”的StringBuilder 它具有解决问题所需的所有方法:charAt,setCharAt,length和toString。
答案 13 :(得分:0)
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.
}
答案 14 :(得分:-1)
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<n;i++)
{
a[i]=s.nextInt();
}
int b[]=new int[n];
for(int i=0;i<n;i++)
{
b[i]=a[i];
}
int end=n-1;
b[0]=b[end];
b[end]=a[0];
for(int i=0;i<n;i++)
{
System.out.println(b[i]);
}
}
}
答案 15 :(得分:-1)
if (str.length() <= 1) {
return str;
}
String mid = str.substring(1, str.length()-1);
return str.charAt(str.length()-1) + mid + str.charAt(0);
答案 16 :(得分:-5)
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.