Как найти повторяющийся символ в строке, не используя встроенные методы класса String в Java-методах, таких как length (), toCharArray (), charAt ()? - PullRequest
0 голосов
/ 20 марта 2019

Как найти повторяющийся символ в строке, не используя встроенные методы класса String в Java-методах, таких как length(), toCharArray(), charAt()?

Спросите в интервью, пожалуйста, дайте мне решения по этому вопросу

input : abcdeddrb
output: db

Ответы [ 4 ]

2 голосов
/ 20 марта 2019

Вы можете сделать это с помощью отражения:

public String findDuplicateChars(String input)
        throws NoSuchFieldException, IllegalAccessException {
    Field valueField = String.class.getDeclaredField("value");
    valueField.setAccessible(true);
    char[] chars = (char[]) valueField.get(input);

    List<Character> duplicatedChars = new ArrayList<>();

    for (int i = 0; i < chars.length; i++) {
        char aChar = chars[i];
        for (int j = i + 1; j < chars.length; j++) {
            char anotherChar = chars[j];
            if (aChar == anotherChar) {
                if (!duplicatedChars.contains(aChar)) {
                    duplicatedChars.add(aChar);
                }
            }
        }
    }

    char[] charArray = new char[duplicatedChars.size()];

    for (int i = 0; i < duplicatedChars.size(); i++) {
        charArray[i] = duplicatedChars.get(i);
    }

    return new String(charArray);
}

Поскольку b является первым дублированным char, то на выходе будет bd, а не db.

Возможно, вопрос интервью состоял в том, чтобы проверить, знаете ли вы рефлексию, или проверить, не попытаетесь ли вы выйти из интервью с ответом типа «Зачем кому-то это делать?».

0 голосов
/ 20 марта 2019

Возможно изменить String на CharSequence и использовать его методы как charAt

  CharSequence cs = s;
0 голосов
/ 20 марта 2019
public static void main(String[] args) {
    String testStr = "abcdeddrb";

    Map<Character, Integer> map = new HashMap<>();
    Map<Character, Integer> duplicateStrMap = null;
    int count = 0;
    int i = 0;

    CharacterIterator it = new StringCharacterIterator(testStr);

    // Loop Characters in a String.
    for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {

        if(map.containsKey(c)){
            if(duplicateStrMap == null){
                duplicateStrMap = new HashMap<>();
            }
            duplicateStrMap.put(c, count);
            count++;
        }
        else{
            map.put(c, ++i);
        }
    }

    // Print Results
    if(duplicateStrMap != null){

        System.out.println("Total Duplcates Found :"+duplicateStrMap.size());            
        Iterator<Character> itr = duplicateStrMap.keySet().iterator();

        System.out.println("Duplicate Characters :");

        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}

Выход:

Всего найдено дубликатов: 2
Дубликаты символов:
b
d

0 голосов
/ 20 марта 2019

Я предполагаю, что ваш интервьюер хотел, чтобы вы использовали карту, чтобы отслеживать, какие символы были замечены, а какие нет.

String input = "abcdeddrb";
Map<Character, Integer> map = new HashMap<>();

for (int i=0; i < input.length(); ++i) {
    Integer count = map.get(input.charAt(i));
    map.put(input.charAt(i), count == null ? 1 : count + 1);
}

map.entrySet().stream()
    .filter(entry -> entry.getValue() > 1)
    .forEach(System.out::println);

b=2
d=3
...