在不影响特殊字符的情况下反转字符串

问题描述 投票:0回答:5

为什么会抛出错误?任何帮助,将不胜感激

public class RAWS 
{
public String rawsc(String ori)
{
    String temp="";
    for(int i=0;i<ori.length();i++)
    {
        char c=ori.charAt(i);
        if(((c>=65)&&(c<=90))||((c>=97)&&(c<122)))
            temp=c+temp;
    }
    for(int i=0;i<ori.length();i++)
    {
        char c=ori.charAt(i);
        if(((c>=65)&&(c<=90))||((c>=97)&&(c<122)))
            ori.replace(c, temp.charAt(i));
    }
    for(int i=0;i<ori.length();i++)
    {
        System.out.println(ori.charAt(i));
    }
    return(ori);
}
public static void main(String[] args) 
{
    String str="a,b$c";
    RAWS ob=new RAWS();
    String new1=ob.rawsc(str);
    for(int i=0;i<new1.length();i++)
    {
        System.out.print(new1.charAt(i)+" ");
    }
}
}

编辑:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4 
at java.lang.String.charAt(String.java:658) 
at arraygs.RAWS.rawsc(RAWS.java:22) 
at arraygs.RAWS.main(RAWS.java:30)
java string reverse
5个回答
1
投票

有问题的部分是调用temp.charAt(i)

for(int i=0;i<ori.length();i++){
    char c=ori.charAt(i);
    if(((c>=65)&&(c<=90))||((c>=97)&&(c<122)))
        ori.replace(c, temp.charAt(i));
}

字符串temp可能没有ori的长度。原因是第一个循环中的if条件

for(int i=0;i<ori.length();i++) {
    char c=ori.charAt(i);
    if(((c>=65)&&(c<=90))||((c>=97)&&(c<122)))
        temp=c+temp;
}

因此,访问i中的位置temp(作为第二个循环的一部分)可能会导致java.lang.StringIndexOutOfBoundsException


1
投票
public class Solution {  
public static void main(String[] args) {  
 System.out.println(reverseString("a,b$c"));  
}  
/**  
* Reverse string with maintaining special character in place  
*  
* Algorithm:  
* 1. create temporary array  
* 2. copy all character from original array excluding special character  
* 3. reverse the temporary array  
* 4. start copying temporary array into original if element is an alphabetic character  
* @param input  
* @return  
*/ 
public static String reverseString(String input) {  
 char[] inputArr = input.toCharArray();  
 char[] tempArr = new char[input.length()];  
 int i=0;  
 int j=0;  
 for (char ch:inputArr){  
   if(Character.isAlphabetic(ch)){  
     tempArr[i] = ch;  
     i++;  
   }  
 }  
 i--;  
 while(j<i){  
   char temp = tempArr[i];  
   tempArr[i]= tempArr[j];  
   tempArr[j]=temp;  
   j++;  
   i--;  
 }  
 for(i=0,j=0;i<input.length();i++){  
   if(Character.isAlphabetic(inputArr[i])){  
     inputArr[i]= tempArr[j++];  
   }  
 }  
 return new String(inputArr);  
}  
}  

0
投票

公共课Ex {

public static void main(String[] args) {
String ss= "Hello@@#+dnksjaf#+43@##@";
char[] c=new char[ss.length()];
String spclCharLessString="";
String spclCharLessStringrev="";

for(int i=0;i<ss.length();i++) {
    if(((ss.charAt(i)>='A'&&ss.charAt(i)<='Z')|(ss.charAt(i)>='a'&&ss.charAt(i)<='z')|(ss.charAt(i)>='0'&&ss.charAt(i)<='9'))) {
        spclCharLessString+=ss.charAt(i);
    }
    c[i]=ss.charAt(i);
}
for(int i=spclCharLessString.length()-1;i>=0;i--) {
    spclCharLessStringrev+=spclCharLessString.charAt(i);
}
int spclCharSpace=0;
for(int i=0;i<ss.length();i++) {
    if(((ss.charAt(i)>='A'&&ss.charAt(i)<='Z')|(ss.charAt(i)>='a'&&ss.charAt(i)<='z')|(ss.charAt(i)>='0'&&ss.charAt(i)<='9'))) {
        c[i]=spclCharLessStringrev.charAt(i-spclCharSpace);
    }else {
        spclCharSpace++;
    }

}
System.out.println(spclCharLessStringrev);
for(char c1:c) {
    System.out.print(c1);
}


}

}


0
投票

使用正则表达式似乎是一个好主意。这是我的JavaScript解决方案。

var reverseOnlyLetters = function(S) {
let arr = S.split('')
let regex = /^[a-zA-Z]{1}$/
let i=0,j=arr.length-1;
while(i<j){
   if(regex.test(arr[i]) && regex.test(arr[j])){
       let temp = arr[i]
       arr[i]=arr[j]
       arr[j]=temp
       i++;j--
   }else{
       if(!regex.test(arr[i])) i++
       if(!regex.test(arr[j])) j--
   } 
}
return arr.join('')

};


0
投票

公共类PracticeJava {

public static void main(String []args){

   String str = "\"Str!ng\"";
   System.out.println("Actual str:  "+str);
   System.out.println("Reverse str: "+reverseStrSpecial(str));

}

public static String reverseStrSpecial(String str) {
    int len = str.length();
    char[] revStrArr = new char[len];
    int j = len-1;
    for (int i=0; i <= j; ) {
        if(!Character.isAlphabetic(str.charAt(i))) {
            revStrArr[i] = str.charAt(i);
            i++;
        } else if (!Character.isAlphabetic(str.charAt(j))) {
            revStrArr[j] = str.charAt(j);
            j--;
        } else {
            revStrArr[j] = str.charAt(i);
            revStrArr[i] = str.charAt(j);
            j--;
            i++;
        }
    }

    return new String(revStrArr);
}

}

© www.soinside.com 2019 - 2024. All rights reserved.