使用位运算、值交换等方式反转java字符串-共四种方法


d l r o {W} {o} l l e H


0 1 2 3 {4} 5 {6} 7 8 9 10





[]( )3\. `Byte[] – StringBuilder(str).reverse(str)`

-------------------------------------------------------------------------------------------------------



以下代码段类似于`StringBuilder(str).reverse()`的内部实现(UTF16内容除外)。



import java.nio.charset.StandardCharsets;

public class ReverseString3 {

public static void main(String[] args) {



    String str = "Hello World";

    System.out.println(reverse(str));



}



public static String reverse(String input) {



    if (input == null || input.length() < 0)

        throw new IllegalArgumentException("Please provide an input!");



    byte[] val = input.getBytes(StandardCharsets.UTF_8);

    int length = val.length - 1;



    for (int start = (length - 1) >> 1; start >= 0; start--) {

        int end = length - start;

        byte temp = val[start];

        val[start] = val[end];

        val[end] = temp;



        // debugging

        //System.out.println(String.format("start=%s, end=%s", start, end));

    }



    return new String(val);

}

}




最令人困惑的部分是右移运算符`(length - 1) >> 1`,这是什么意思?查看下面的8位示例,您可以找到规律吗?



System.out.println(10>>1); // 10 -> 5

0000 1010 = 10

0000 0101|0 = 10 >> 1 = 5

System.out.println(4>>1); // 4 -> 2

0000 0100 = 4

0000 0010|0 = 4 >> 1 = 2

System.out.println(100>>1); // 100 -> 50

0110 0100 = 100

00110 010|0 = 100 >> 1 = 50

System.out.println(7>>1); // 7 -> 3

0000 0111 = 7

0000 0011|1 = 7 >> 1 = 3




对于数字,每右移1位,金额将减少该值的一半并四舍五入。这`(length - 1) >> 1`试图找出字符串的中间点。



number >> 1 = round_down(number/2) or Math.flooa(number/2)




值交换从内部开始,然后扩展到外部。



for (int start = (length - 1) >> 1; start >= 0; start–) {

int end = length - start;

byte temp = val[start];

val[start] = val[end];

val[end] = temp;

}




上面的算法图示如下:




H e l l o W o r l d


0 1 2 3 4 5 6 7 8 9 10


Loop #1 - Swap index 4 <-> index 6


H e l l {W} {o} o r l d


0 1 2 3 {4} 5 {6} 7 8 9 10


Loop #2 - Swap index 3 <-> index 7


H e l {o} W o {l} r l d


0 1 2 {3} 4 5 6 {7} 8 9 10


Loop #3 - Swap index 2 <-> index 8


H e {r} o W o l {l} l d


0 1 {2} 3 4 5 6 7 {8} 9 10


Loop #4 - Swap index 1 <-> index 9


H {l} r o W o l l {e} d


0 {1} 2 3 4 5 6 7 8 {9} 10


Loop #5 - Swap index 0 <-> index 10


{d} l r o W o l l e {H}


{0} 1 2 3 4 5 6 7 8 9 {10}





[]( )4\. Apache commons-lang3

---------------------------------------------------------------------------------



对于[Apache commons-lang3]( )库,我们可以使用`StringUtils.reverse`反转字符串和`StringUtils.reverseDelimited`反转单词。



pom.xml



<groupId>org.apache.commons</groupId>

<artifactId>commons-lang3</artifactId>

<version>3.10</version>

import org.apache.commons.lang3.StringUtils;

public class ReverseString3 {

public static void main(String[] args) {



    System.out.println(StringUtils.reverse("Hello World Java"));                // reverse string



    System.out.println(StringUtils.reverseDelimited("Hello World Java", ' '));  // reverse words



}

}




输出结果



avaJ dlroW olleH

Java World Hello




查看其源代码,`Apache-commons-lang3`其实是使用`new StringBuilder(str).reverse()`来反转字符串。



package org.apache.commons.lang3;

public class StringUtils {

public static String reverse(final String str) {

  if (str == null) {

      return null;

  }

  return new StringBuilder(str).reverse().toString();

}

面试题总结

其它面试题(springboot、mybatis、并发、java中高级面试总结等)

public static String reverse(final String str) {

  if (str == null) {

      return null;

  }

  return new StringBuilder(str).reverse().toString();

}

面试题总结

其它面试题(springboot、mybatis、并发、java中高级面试总结等)

[外链图片转存中…(img-VZdMyVG6-1714577016511)]

[外链图片转存中…(img-UfxC4TcP-1714577016512)]

[外链图片转存中…(img-IcAh9g7a-1714577016512)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值