【问题标题】:I want to Reverse a string in Java and drop and duplicates我想在 Java 中反转一个字符串并删除和重复
【发布时间】:2019-06-23 07:48:45
【问题描述】:

将字符串转换为字节:getBytes() 方法用于将输入字符串转换为字节[]。 方法:

  1. 创建一个长度相等的临时字节[] 到输入字符串的长度。
  2. 存储字节(我们通过使用 getBytes() 方法)以相反的顺序进入 临时字节[]。
  3. 使用 byte[] 创建一个新的 String abject 存储结果。

来源

// Java program to ReverseString using ByteArray. 
import java.lang.*; 
import java.io.*; 
import java.util.*; 

// Class of ReverseString 
class ReverseString 
{ 
    public static void main(String[] args) 
    { 
        String input = "Geeks"; 

        // getBytes() method to convert string  
        // into bytes[]. 
        byte [] strAsByteArray = input.getBytes(); 

        byte [] result =  
                   new byte [strAsByteArray.length]; 

        // Store result in reverse order into the 
        // result byte[] 
        for (int i = 0; i<strAsByteArray.length; i++) 
            result[i] =  
             strAsByteArray[strAsByteArray.length-i-1]; 

        System.out.println(new String(result)); 
    } 
} 

我希望输出是:skeg

【问题讨论】:

  • 您在哪里检查重复项?

标签: java string byte reverse


【解决方案1】:

您需要跟踪当前字节,如果与前一个字节相同,则不要添加以下字节:

String input = "Geeks";
byte[] strAsByteArray = input.getBytes(); 
List<Byte> list = new ArrayList<>();
//byte[] result = new byte[strAsByteArray.length];
byte prev = 0;

for (int i=0; i < strAsByteArray.length; i++) {
    byte curr = strAsByteArray[strAsByteArray.length-i-1];
    if (curr != prev) {
        prev = curr;
        list.add(curr);
    }
}

byte[] result = new byte[list.size()];
for (int i=0; i < list.size(); ++i) {
    result[i] = list.get(i);
}

System.out.println(new String(result));

打印出来:

skeG

请注意,我最初使用一个列表来存储字节,因为在我们反向解析整个字符串之前,我们实际上并不知道固定字节数组的最终大小。我想找到一种使用流将List&lt;Byte&gt; 转换为原始字节数组的时尚方法。失败了,我只是使用了增强的 for 循环。

【讨论】:

  • 如果重复不连续怎么办?
  • @Kartik 我在原始问题中没有看到/解释这个要求。如果我错过了什么,我会等待 OP 发表评论。
【解决方案2】:

做嵌套循环。 这没有使用集合/列表。 在创建结果后放置它。

byte[] finalResult = new byte[result.length];
int k = 0;

for (int i = 0; i < result.length; i++) {
    boolean hasDuplicates = false;

    for (int j = i + 1; j < result.length; j++) {
        if (result[i] == result[j]) {
            hasDuplicates = true;
        }
    }

    if (!hasDuplicates) {
           finalResult[k++] = result[i];
    }
}

System.out.println(new String(finalResult));

示例:欢迎

结果:moclew

不确定这是否是您的预期回复。


有一个更好的方法,只使用更少的循环。

【讨论】:

    【解决方案3】:

    这就是我一直在寻找的解决方案

        public class CodeExercise
    

    {

    public static void main(String[] args)
    {
        String input = "abbac";
    
        char[] strArr= input.toCharArray();
    
      String result = "";
    
      // Reverse
      for(int i = strArr.length -1; i>=0; i--){
          result = result + strArr[i];
    
      }
      result = removeDuplicate(result.toCharArray());
      System.out.println(new String(result));
    }
    
     // Collapsing any adjacent duplicate characters
    public static String removeDuplicate(char[] chars)
    {
        char prev = '\0';
        int x = 0;
    
        for (int i = 0; i < chars.length; i++)
        {
            if (prev != chars[i]) {
                chars[x++] = chars[i];
                prev = chars[i];
            }
        }
    
        return new String(chars).substring(0, x);
    }
    

    }

    【讨论】:

      【解决方案4】:

      您只需使用以下语法将 byte[] 转换为字符串:

      System.out.println(new String(result, "UTF-8");
      

      【讨论】:

        猜你喜欢
        • 2021-06-07
        • 1970-01-01
        • 2020-11-12
        • 2014-07-12
        • 2013-07-05
        • 2012-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多