Я хочу обратить строку в Java и удалить и дублировать - PullRequest
0 голосов
/ 30 января 2019

Преобразование строки в байты: метод getBytes () используется для преобразования входной строки в байты [].Метод:

  1. Создайте временный байт [] длины, равной длине входной строки.
  2. Сохраните байты (которые мы получаем с помощью метода getBytes ()) в обратном порядке.порядок во временном байте [].
  3. Создание нового объекта String с использованием байта [] для сохранения результата.

Источник

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

Я ожидаю выводабыть: скег

Ответы [ 4 ]

0 голосов
/ 26 февраля 2019

Это решение, которое я искал

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

}

0 голосов
/ 30 января 2019

вам просто нужно преобразовать byte[] в строку, используя следующий синтаксис:

System.out.println(new String(result, "UTF-8");
0 голосов
/ 30 января 2019

У вложенного цикла.Это без использования коллекции / списка.Поместите это после того, как вы создали свой результат.

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

Не уверен, что это ваш предполагаемый ответ.


Есть лучший способ для этого, используя меньше циклов.

0 голосов
/ 30 января 2019

Вам необходимо отслеживать текущий байт и не добавлять следующий байт, если он совпадает с предыдущим:

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.

...