我想反转Java中的字符串并删除和重复

时间:2019-01-30 05:09:45

标签: java string byte reverse

将字符串转换为字节: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

5 个答案:

答案 0 :(得分:0)

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

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<Byte>转换为原始字节数组。失败了,我只是使用了增强的for循环。

答案 1 :(得分:0)

执行嵌套循环。 这不使用集合/列表。 在创建结果后将其放置。

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

示例:欢迎

结果:mo夫

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


有一种更好的方法,可以使用更少的循环。

答案 2 :(得分:0)

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

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

}

答案 3 :(得分:-1)

您可以先反转字符串,然后再从字符串中删除多个字符,如下所示:

  public static void main(String[] args) {
    String input = "Geeks";
    String input2 = reverseString(input);
    StringBuilder input3 = getString(input2);
    System.out.println(new String(input3));
  }

  private static String reverseString(String input) {
    StringBuilder input1 = new StringBuilder();

    // append a string into StringBuilder input1
    input1.append(input);

    // reverse StringBuilder input1
    input1 = input1.reverse();
    return new String(input1);
  }

  private static StringBuilder getString(String input2) {
    StringBuilder input3 = new StringBuilder();
    ArrayList<Character> usedChars =  new ArrayList<>();

    for (char ch: input2.toCharArray()) {
      if (!usedChars.contains(ch)){
        input3.append(ch);
        usedChars.add(ch);
      }
    }
    return input3;
  }

答案 4 :(得分:-2)

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

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