为什么会抛出错误?任何帮助,将不胜感激
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)
有问题的部分是调用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
。
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);
}
}
公共课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);
}
}
}
使用正则表达式似乎是一个好主意。这是我的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('')
};
公共类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);
}
}