Чтобы убедиться, что строка ascii содержит уникальный символ с использованием битовых операций без использования дополнительных структур данных - PullRequest
0 голосов
/ 26 апреля 2018

Я пытался решить эту проблему, но моя программа не работает, когда ввод содержит маленькую и заглавную версию того же алфавита во входной строке, например: - Test, Abca.

// Assuming Input to be an ASCII String i.e a total of 128 unique characters, which map to the numbers 0–127.

public class Q1_1 {
    public static void main(String[] args) {
        long firstHalf = 0; // 0 - 63
        long secondHalf = 0; // 64 - 127
        Scanner sc = new Scanner(System.in);
        String x = sc.nextLine();
        for(int i = 0; i < x.length(); i++) {
            byte b = (byte) x.charAt(i);
            System.out.println((char) b + " - " + b);
            if(b < 63) { // search firstHalf
                System.out.println("First Half");
                long mask = 1 << b;
                if((firstHalf & mask) == 0) { // unique character is encountered
                    firstHalf |= mask;
                } else {
                    System.out.println("String contains Duplicate Character");
                    return;
                }
            } else if(b > 63 && b < 128) {
                System.out.println("Second Half");
                long mask = 1 << (b - 64);
                if((secondHalf & mask) == 0) {  // unique character is encountered
                    secondHalf |= mask;
                } else {
                    System.out.println("String contains Duplicate Character");
                    return;
                }
            }
        }
        System.out.println("ASCII String contains only unique character");
    }
}

Как ясно видно из вывода, программа останавливается, когда встречает 't'.

Output

1 Ответ

0 голосов
/ 26 апреля 2018

Это потому что бит сдвигается:

(1 << (b - 64))

Выполняется с int , не длинным, поэтому смещение повторяется после 32 бит.

Сделайте долгое переключение, используя:

(1L << (b - 64))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...