【问题标题】:Reverse a String without affecting special characters反转字符串而不影响特殊字符
【发布时间】:2017-08-20 13:47:43
【问题描述】:

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

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 效率的提示:对于 temp 变量,使用 StringBuilder 类及其 append() 方法,因为在字符串上重复使用 + 运算符会产生很多中间String 和 StringBuilder 实例(每次迭代一个)。
  • 重组建议:您尝试在一种方法中做两件事,删除特殊字符并反转剩余字符串中的字符顺序。将其拆分为两种方法可能会使工作更容易。

标签: java string reverse


【解决方案1】:

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

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;
}

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

【讨论】:

  • 谢谢!就是你说的问题,现在没有错误了。但仍然没有欲望的输出。也许逻辑上有问题。
【解决方案2】:

公共类 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);
}

}

【讨论】:

  • 请不要只发布代码。而是解释为什么您的代码解决了操作问题。
【解决方案3】:
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);  
}  
}  

【讨论】:

    【解决方案4】:

    公开课前 {

    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);
    }
    
    
    }
    

    }

    【讨论】:

      【解决方案5】:

      使用正则表达式似乎是个好主意。这是我的 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('')
      

      };

      【讨论】:

        【解决方案6】:
        str=input("enter any string")
        l=[]
        s=""
        list=list(str)
        for i in str:
            k=ord(i)
            if((k>=48 and k<=57) or (k>=65 and k<=90) or(k>=97 and k<=122)):
                l.append(i)
        l.reverse()
        print(s.join(l))
        

        作者:sreevidhya bontha

        【讨论】:

        • 请不要只发布代码。而是解释为什么您的代码解决了操作问题。以及它如何不同或基于现有答案。
        【解决方案7】:
          public static void main(String[] args) {
                String str = "fed@cb%a!";
                char arr[] = new char[str.length()];
                for (int i = 0; i < str.length(); i++) {
                    if (str.charAt(i) < 48 || (str.charAt(i) > 57 && str.charAt(i) < 65) || (str.charAt(i) > 90 && str.charAt(i) < 97) || str.charAt(i) > 122)
                        arr[i] = str.charAt(i);
                    else
                        arr[i] = '0';
                }
                Stack<Character> stack = new Stack<>();
                for (int i = 0; i < str.length(); i++) {
                    stack.push(str.charAt(i));
                }
                int i=0;
                while(!stack.isEmpty()){
                    char pop = stack.pop();
                    if (!(pop < 48 || (pop > 57 && pop < 65) || (pop > 90 && pop < 97) || pop > 122)){
                        arr[i] = pop;
                        ++i;
                    }
                    if(arr[i]!='0'){
                        ++i;
                    }
                }
                for ( i = 0; i < str.length(); i++) {
                    System.out.print(arr[i]);
                }
            }
        Time complexity: O(n)
        

        【讨论】:

          【解决方案8】:
          public static void main(String[] args) {
                  String a = "ab$cd";
                  char[] b = a.toCharArray();
                  int c = b.length;
                  for (int i = 0; i < c / 2; i++) {
                      if (Character.isAlphabetic(b[i]) || Character.isDigit(b[i])) {
                          char temp = b[i];
                          b[i] = b[c - i - 1];
                          b[c - i - 1] = temp;
                      }
                  }
              System.out.println(String.valueOf(b));
          }
          

          【讨论】:

          • 这是字符串中只有一个特殊字符时的解决方案。
          【解决方案9】:

          公共类 MuthuTest { 静态地图列表 = new HashMap();

          /*
           * public static int fact(int n) { if(n>1) return n*fact(n-1); else return 1; }
           */
          @SuppressWarnings("deprecation")
          public static void main(String[] args) {
              String j = "muthu is a good boy.";
              int v = 0;
              String[] s = j.split(" ");
              for (int h = 0; h < s.length; h++) {
                  String y;
                  y = s[h].replaceAll("[A-Za-z0-9]", "");
          
                  list.put(h, y);
          
              }
          
              // MuthuTest.li(s);
              for (int u = s.length - 1; u >= 0; u--) {
                  if (u == 0) {
          
                      s[u] = s[u].replaceAll("[^A-Za-z0-9]", "");
                      System.out.print(s[u] + list.get(v));
          
                  } else {
                      s[u] = s[u].replaceAll("[^A-Za-z0-9]", "");
          
                      System.out.print(s[u] + list.get(v) + " ");
                  }
          
                  v++;
              }
          
          }
          

          }

          【讨论】:

            【解决方案10】:

            [Java] 只反转字母而不影响特殊字符的简单方法。

            public class StringReverse {
                public static void main(String[] args) {
                   reverseString("T@E$J#A%S");
            }
            
            //S@A$JE@T
            private static void reverseString(String s){
                int len = s.length();
                char[] arr = new char[len];
                for(int i=0; i<len; i++){
                    char ch = s.charAt(i);
                    if(Character.isAlphabetic(ch)){
                        arr[len-1-i] = ch;
                    }else{
                        arr[i] = ch;
                    }
                }
            
                System.out.println(new String(arr));
            }
            

            }

            【讨论】:

              【解决方案11】:
              import java.util.HashMap;
              import java.util.Map.Entry;
              
              
              
              public class ReverseString {
              
                  public static void main(String[] args) {
                      HashMap<Character, Integer> map = new HashMap<>();
                      String s = "S@3jakd*nd%4*ksdkj12";
                      String str = "";
                      int len = s.length();
              
                      for (int i = len - 1; i >= 0; i--) {
                          char ch = s.charAt(i);
                          if (Character.isAlphabetic(ch) || Character.isDigit(ch)) {
                              str = str + s.charAt(i);
                          } else {
              
                              map.put(s.charAt(i), new Integer(s.indexOf(s.charAt(i))));
              
                          }
                      }
              
                      for (Entry<Character, Integer> entry : map.entrySet()) {
              
                          str = str.substring(0, entry.getValue()) + entry.getKey() + str.substring(entry.getValue(), str.length());
              
                      }
                      System.out.println(str);
                  }
              
              }
              

              【讨论】:

              • 嗨,欢迎来到 Stack Overflow!为了更好地帮助 OP,您应该在答案中添加解释,而不仅仅是代码。试着回答“为什么你的代码能解决问题?”
              【解决方案12】:

              在不影响任何特殊字符的情况下反转字符串。请注意,它仅适用于字符串,而不是最终将成为字符串数组的字符串组合。

              代码:

              public class Info {
                  
                  // Input : str = "Ab,c,de!$"               o/p : ed,c,bA!$
                  public static void main(String[] args) {
                      String input = "Ab,c,de!$";
                      char[] inputCharArray = input.toCharArray();
                      reverseIgnoreSpecialCharacters(inputCharArray);
                      
                  }
                  
                  public static void reverseIgnoreSpecialCharacters(char[] charArray) {
                      int j = charArray.length-1;
                      int k = 0;
                      for(int i = charArray.length-1; i>=0;  i--) {
                          if(!(charArray[i] >= 65 && charArray[i] <=90) || !(charArray[i] >= 97 && charArray[i] <=122)) {
                              charArray[j] = charArray[i];
                              System.out.print(charArray[j]);
                              j--;
                              
                          }
                          else {
                              charArray[k] = charArray[i];
                              System.out.print(charArray[k]);
                              k++;
                          }       
                      }   
                  }
              }
              

              对于多个字符串,您可以如下所示:

              代码:

              public class Info {
                  
                  // Input : str = "Ab,c,de!$"               o/p : ed,c,bA!$
                  public static void main(String[] args) {
                      String input = "Ab,c,de!$ Abhi$hek";
                      String[] inputStringArray = input.split("\\ ");
                      for(int i = inputStringArray.length-1; i>=0; i--) {
                          char[] strArray = inputStringArray[i].toCharArray();
                          reverseIgnoreSpecialCharacters(strArray);
                          System.out.print(" ");
                      }
                      
                  }
                  
                  public static void reverseIgnoreSpecialCharacters(char[] charArray) {
                      int j = charArray.length-1;
                      int k = 0;
                      for(int i = charArray.length-1; i>=0;  i--) {
                          if(!(charArray[i] >= 65 && charArray[i] <=90) || !(charArray[i] >= 97 && charArray[i] <=122)) {
                              charArray[j] = charArray[i];
                              System.out.print(charArray[j]);
                              j--;
                              
                          }
                          else {
                              charArray[k] = charArray[i];
                              System.out.print(charArray[k]);
                              k++;
                          }       
                      }   
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-07-20
                • 1970-01-01
                • 2022-09-24
                • 1970-01-01
                • 2015-05-01
                • 2013-03-08
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多