Отладка: как удалить последовательно встречающиеся символы в строке? - PullRequest
0 голосов
/ 02 августа 2020

Ниже мой код для удаления последовательно встречающихся символов в строке, но не получил ожидаемого результата ...

import java.util.*;
import java.lang.*;
import java.io.*;
           
class GFG {
    public static void main (String[] args)  {
    
        Scanner sc= new Scanner(System.in);
        int t=sc.nextInt();
        while(t-->0){
            String name= sc.next();
            char[] c = new char[name.length()];
            int j=0;
            boolean check=true;
            //looping through the array to find duplicates 
            for(int i=0;i<name.length()-1;i++){
                if(name.charAt(i)==name.charAt(i+1)){
                     continue;
                }
                else{
                   c[j]=name.charAt(i);
                   j++;
                   check=false;
                }
            }
            //printing the char array
            if(check==true){
                System.out.println(name);
            }else{
                for(int i=0;i<j+1;i++){
                    System.out.print(c[i]);
                }
                System.out.print(name.charAt(name.length()-1));
                System.out.println();
            }
        }
    }
}
       

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

Ответы [ 4 ]

3 голосов
/ 02 августа 2020

Вы можете использовать такой подход:

class GFG {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        String name = sc.next();
        String result = "";

        if (name.length() > 0)
            result += name.charAt(0);
        //looping through the array to find duplicates
        for (int i = 1; i < name.length(); i++){
            if (name.charAt(i) == name.charAt(i - 1)){
                continue;
            } else {
                result+=name.charAt(i);
            }
        }
        //printing the result
        System.out.print(result);
    }
}
1 голос
/ 03 августа 2020

Хорошо, с вашим кодом есть несколько проблем.

Давайте обозначим номера строк, как показано ниже:

01  char[] c = new char[name.length()];
02  int j=0;
03  boolean check=true;
04  //looping through the array to find duplicates 
05  for(int i=0;i<name.length()-1;i++){
06      if(name.charAt(i)==name.charAt(i+1)){
07           continue;
08      }
09      else{
10         c[j]=name.charAt(i);
11         j++;
12         check=false;
13      }
14  }
15  //printing the char array
16  if(check==true){
17      System.out.println(name);
18  }else{
19      for(int i=0;i<j+1;i++){
20          System.out.print(c[i]);
21      }
22      System.out.print(name.charAt(name.length()-1));
23      System.out.println();
24  }

Первая проблема - это комбинация строк 1, 19, 20 , 21, 22. Я знаю, что эти строки были поставлены таким образом, потому что вы не знаете длину сокращенной строки. Таким образом, вы усложняете ситуацию с for l oop, а затем получаете последний символ из исходной строки. Однако что, если ваша строка заканчивается двумя одинаковыми символами?

Если я не ошибаюсь, они будут напечатаны дважды. блоки. Ничего из этого не требуется.

Итак, давайте решим все эти проблемы одновременно.

01  StringBuilder sb = new StringBuilder();
02  int lastChar = 65537; // This char will never exist as char is 16 bits in Java.
03  for (int i = 0; i < name.length(); i++) {
04      char c = name.charAt(i);
05      if (c != lastChar) // perform int comparison so first char will be picked up.
06      {
07          sb.append(c);
08          lastChar = c; // widens c into an int.
09      }
10  }
11  System.out.println(sb.toString());

Мы можем просто решить проблему с неизвестной длиной, используя StringBuilder, ArrayList, et c. .. StringBuilder будет самым простым.

Мы также можем использовать int вместо char для отслеживания последнего обработанного символа. Мы используем здесь int вместо char, так как нам нужно, чтобы начальное состояние не соответствовало, независимо от того, какой символ встречается. Другой метод, который можно использовать здесь, - использовать Character, но он будет дороже (объект кучи), чем использование расширения int для примитива.

Попробуйте и дайте мне знать, если у вас возникнут трудности с пониманием.

1 голос
/ 02 августа 2020

Альтернативой может быть использование java 8 потоков.

Шаги:

  1. Начать IntStream от index = 1 до конца. (Поскольку значение результата изначально равно символу с индексом 0)
  2. Добавить символ к окончательному результату, если он не соответствует последнему встреченному символу.
import java.util.*;
import java.util.stream.IntStream;
class GFG {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while (t-- > 0) {
            String name = sc.next();
            String result = IntStream.range(1, name.length())
                                    .mapToObj(i -> name.charAt(i) + "")
                                    .reduce(name.charAt(0) + "", (p, s) -> p.lastIndexOf(s) == p.length() - 1 ? p : p + s);
            System.out.println(result);
        }
    }
}

Примечание. использует простую конкатенацию строк.

0 голосов
/ 02 августа 2020

Всегда помните о следующих моментах при написании кода:

  1. Следуйте Java соглашениям об именах . Имена переменных должны быть короткими, но содержательными. Кроме того, имена классов должны быть в смешанном регистре, а первая буква каждого внутреннего слова должна быть заглавной. Вам также следует избегать акронимов и сокращений, если только аббревиатура не используется гораздо шире, чем полная форма, например, URL, HTML et c.
  2. Отображать соответствующее сообщение перед запросом ввода; в противном случае пользователь будет гадать, требуется ли какой-либо ввод для программы. * Пример кода:
    import java.util.Scanner;
    
    public class MyWordTranslator {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            
            System.out.print("How many times you want to try?: ");
            int times = scanner.nextInt();
            
            while (times-- > 0) {
                System.out.println("Round #" + times);
    
                System.out.print("Enter some word: ");
                String word = scanner.next();
    
                // Variable to hold the translated word
                StringBuilder translatedWord = new StringBuilder();
    
                // Add the first letter of word to translatedWord
                translatedWord.append(word.charAt(0));
    
                // Process the remaining letters (i.e. from index 1 onwards) of word
                for (int i = 1; i < word.length(); i++) {
                    // Add the letter to translatedWord if it is different from the preceding letter
                    if (word.charAt(i) != word.charAt(i - 1)) {
                        translatedWord.append(word.charAt(i));
                    }
                }
    
                // Display the translated word
                System.out.println("The translated word is: " + translatedWord);
            }
        }
    }
    

    Пробный запуск:

    How many times you want to try?: 2
    Round #1
    Enter some word: caaaabaaad
    The translated word is: cabad
    Round #0
    Enter some word: luliia
    The translated word is: lulia
    
...