Java 如何(单独)反转字符串中的每个单词?

Java 如何(单独)反转字符串中的每个单词?,java,string,reverse,Java,String,Reverse,Java专家需要您的帮助 今天我在一次采访中被问到了这个问题,但我无法解决。 所以我需要一个解决方案,我应该如何解决这个问题 反转字符串 Input : Hello, World! Output : olleH, dlroW! 在这种情况下,字母数字颠倒,其余部分保留在相同的位置,这意味着逗号和感叹号保留在相同的位置 您只能使用4个字符串函数来获得答案 查拉特(c) 长度() 塞查拉特(i,c) 布尔isAlphaNumeric() 我尝试了以下代码 public void String(S

Java专家需要您的帮助

今天我在一次采访中被问到了这个问题,但我无法解决。 所以我需要一个解决方案,我应该如何解决这个问题

反转字符串

Input  : Hello, World!
Output : olleH, dlroW!
在这种情况下,字母数字颠倒,其余部分保留在相同的位置,这意味着逗号和感叹号保留在相同的位置

您只能使用4个字符串函数来获得答案

  • 查拉特(c)
  • 长度()
  • 塞查拉特(i,c)
  • 布尔isAlphaNumeric()
  • 我尝试了以下代码

    public void String(String str){     
        String temp;
    
        for(int i=str.length-1;i>=0;i--){
            temp = temp + str.charAt(i);
        }
    }
    

    但是上面的代码会反转整个字符串。

    首先使用
    str.split(“[^a-zA-Z]”)将字符串拆分为单词。

    然后循环遍历数组,并像上面那样反转每个部分。最后,再次将字符串连接在一起。要按顺序获得分隔符数组,只需使用
    str.split('[a-zA-Z]')

    例如:

    String[] words=str.split('[^a-zA-Z]');
    String[] separators=str.split('[a-zA-Z]');
    
    //Left as an exercise: reverse each element of the words array (as you did in the original question)
    
    int offset=0;
    //Left as an exercise: If the sentence starts with punctuation, increment offset by one and insert the punctuation at the beginning
    
    StringBuilder sb = new StringBuilder();
    for(int i=0;i<words.length;i++)
    {
        sb.append(words[i]);
        if(i+offset<separators.length)
        {
            sb.append(separators[i+offset]);
        }
    }
    
    String[]words=str.split(“[^a-zA-Z]”);
    字符串[]分隔符=str.split('[a-zA-Z]');
    //左为练习:反转单词数组的每个元素(如您在原始问题中所做的那样)
    整数偏移=0;
    //左作为练习:如果句子以标点符号开头,则按1递增偏移量,并在开头插入标点符号
    StringBuilder sb=新的StringBuilder();
    
    对于(int i=0;i,首先使用
    str.split(“[^a-zA-Z]”)将字符串拆分为单词。

    然后循环遍历数组,并像上面那样反转每个部分。最后,再次将字符串连接在一起。要按顺序获得分隔符数组,只需使用
    str.split(“[a-zA-Z]”)

    例如:

    String[] words=str.split('[^a-zA-Z]');
    String[] separators=str.split('[a-zA-Z]');
    
    //Left as an exercise: reverse each element of the words array (as you did in the original question)
    
    int offset=0;
    //Left as an exercise: If the sentence starts with punctuation, increment offset by one and insert the punctuation at the beginning
    
    StringBuilder sb = new StringBuilder();
    for(int i=0;i<words.length;i++)
    {
        sb.append(words[i]);
        if(i+offset<separators.length)
        {
            sb.append(separators[i+offset]);
        }
    }
    
    String[]words=str.split(“[^a-zA-Z]”);
    字符串[]分隔符=str.split('[a-zA-Z]');
    //左为练习:反转单词数组的每个元素(如您在原始问题中所做的那样)
    整数偏移=0;
    //左作为练习:如果句子以标点符号开头,则按1递增偏移量,并在开头插入标点符号
    StringBuilder sb=新的StringBuilder();
    对于(inti=0;i
    publicsstringreversestring(stringstr){
    字符串temp=“”,结果=“”;
    对于(inti=0;i='A'&&str.charAt(i)='A'&&str.charAt(i)='0'&&str.charAt(i)
    public String reverseString(String str){
    字符串temp=“”,结果=“”;
    
    对于(int i=0;i='A'&&str.charAt(i)='A'&&str.charAt(i)='0'&&str.charAt(i)您可以尝试使用正则表达式查找所有单词,然后使用Matchers方法和
    appendTail
    用反向版本替换已建立的单词。要生成单词的反向版本,您可以使用

    StringBuilder().append(word).reverse().toString();
    
    这是你可以做到的

    public static void main(String[] args) throws Exception {
        Pattern p = Pattern.compile("\\p{IsAlphabetic}+");
    
        StringBuffer sb = new StringBuffer();
    
        Matcher m = p.matcher("Hello, World!");
        while (m.find()) {
            m.appendReplacement(sb, reverseWord(m.group()));
        }
        m.appendTail(sb);
    
        System.out.println(sb);
    }
    
    private static String reverseWord(String word) {
        return new StringBuilder().append(word).reverse().toString();
    }
    
    输出:

    olleH, dlroW!
    

    您可以尝试使用正则表达式查找所有单词,然后使用Matchers方法和
    appendTail
    将建立的单词替换为反向版本。要生成单词的反向版本,可以使用

    StringBuilder().append(word).reverse().toString();
    
    这是你可以做到的

    public static void main(String[] args) throws Exception {
        Pattern p = Pattern.compile("\\p{IsAlphabetic}+");
    
        StringBuffer sb = new StringBuffer();
    
        Matcher m = p.matcher("Hello, World!");
        while (m.find()) {
            m.appendReplacement(sb, reverseWord(m.group()));
        }
        m.appendTail(sb);
    
        System.out.println(sb);
    }
    
    private static String reverseWord(String word) {
        return new StringBuilder().append(word).reverse().toString();
    }
    
    输出:

    olleH, dlroW!
    

    setCharAt不是字符串函数,因为字符串是不可变的,但是您可以使用char数组或StringBuilder(仅包装char数组)来实现这一点.isAlphaNumeric不是我能找到的任何地方的标准方法,但是Character.isAlphabetic是我相信您想要的。我正在尽可能地使用它来满足您的限制:

    private static CharSequence reverseWords( CharSequence in )
    {
        StringBuilder sb = new StringBuilder( in );
        for( int i = 0, len = sb.length(); i < len; i++ )
        {
            if( Character.isAlphabetic( sb.charAt( i ) ) )
            {
                int end = i;
                while( ++end < len && Character.isAlphabetic( sb.charAt( end ) ) );
                int j = end - 1;
                while( j > i )
                {
                    char temp = sb.charAt( i );
                    sb.setCharAt( i++, sb.charAt( j ) );
                    sb.setCharAt( j--, temp );
                }
                i = end;
            }
        }
        return sb;
    }
    
    private static CharSequence reverseWords(CharSequence in)
    {
    StringBuilder sb=新的StringBuilder(in);
    for(int i=0,len=sb.length();ii)
    {
    字符温度=某人字符(i);
    sb.setCharAt(i++,sb.charAt(j));
    b.塞查拉特(j--,临时);
    }
    i=结束;
    }
    }
    归还某人;
    }
    
    但是,如果要在不使用StringBuilder的情况下直接使用字符数组,请执行以下操作:

    private static String reverseWords( String in )
    {
        char[] chars = in.toCharArray();
        for( int i = 0, len = chars.length; i < len; i++ )
        {
            if( Character.isAlphabetic( chars[i] ) )
            {
                int end = i;
                while( ++end < len && Character.isAlphabetic( chars[end] ) );
                int j = end - 1;
                while( j > i )
                {
                    char temp = chars[i];
                    chars[i++] = chars[j];
                    chars[j--] = temp;
                }
                i = end;
            }
        }
        return String.valueOf( chars );
    }
    
    私有静态字符串反向记录(字符串输入)
    {
    char[]chars=in.toCharArray();
    for(int i=0,len=chars.length;ii)
    {
    字符温度=字符[i];
    chars[i++]=chars[j];
    字符[j--]=温度;
    }
    i=结束;
    }
    }
    返回字符串.valueOf(字符);
    }
    
    setCharAt不是字符串函数,因为字符串是不可变的,但是您可以使用char数组或StringBuilder(仅包装char数组)来实现这一点.isAlphaNumeric不是我能找到的任何地方的标准方法,但是Character.isAlphabetic是我相信您想要的。我正在尽可能地使用它来满足您的限制:

    private static CharSequence reverseWords( CharSequence in )
    {
        StringBuilder sb = new StringBuilder( in );
        for( int i = 0, len = sb.length(); i < len; i++ )
        {
            if( Character.isAlphabetic( sb.charAt( i ) ) )
            {
                int end = i;
                while( ++end < len && Character.isAlphabetic( sb.charAt( end ) ) );
                int j = end - 1;
                while( j > i )
                {
                    char temp = sb.charAt( i );
                    sb.setCharAt( i++, sb.charAt( j ) );
                    sb.setCharAt( j--, temp );
                }
                i = end;
            }
        }
        return sb;
    }
    
    private static CharSequence reverseWords(CharSequence in)
    {
    StringBuilder sb=新的StringBuilder(in);
    for(int i=0,len=sb.length();ii)
    {
    字符温度=某人字符(i);
    sb.setCharAt(i++,sb.charAt(j));
    b.塞查拉特(j--,临时);
    }
    i=结束;
    }
    }
    归还某人;
    }
    
    但是,如果要在不使用StringBuilder的情况下直接使用字符数组,请执行以下操作:

    private static String reverseWords( String in )
    {
        char[] chars = in.toCharArray();
        for( int i = 0, len = chars.length; i < len; i++ )
        {
            if( Character.isAlphabetic( chars[i] ) )
            {
                int end = i;
                while( ++end < len && Character.isAlphabetic( chars[end] ) );
                int j = end - 1;
                while( j > i )
                {
                    char temp = chars[i];
                    chars[i++] = chars[j];
                    chars[j--] = temp;
                }
                i = end;
            }
        }
        return String.valueOf( chars );
    }
    
    私有静态字符串反向记录(字符串输入)
    {
    char[]chars=in.toCharArray();
    for(int i=0,len=chars.length;i