2017-06-30 5 views
2
public static boolean uniqueCheck(String s) 
{ 
    int checker=0,val=0; 
    for (int i = 0; i < s.length(); i++) { 
     val=s.charAt(i)-'a'; 
     if ((checker & (1<< val))>0) return false; 
     checker |= (1<<val); 
    } 
    return true; 
} 

Je veux savoir comment ce code ignorera l'espace() et retournera vrai pour le caractère unique. Pour un exemple: "a b c d" renvoie la valeur true. mais l'espace a aussi une valeur Unicode, quand il rencontre l'espace 2 fois il devrait renvoyer faux. Pourquoi pas??Vérification du caractère unique dans une chaîne (java)

+0

Vous devriez décrire ce que vous voulez réaliser. Le code est bon pour 'aa' mais échoue pour' '(deux espaces), parce que' s.charAt (i) - 'a'' est négatif pourquoi votre 'if-statement' échoue. – SubOptimal

Répondre

-1

Vous devez utiliser replaceAll() pour remplacer tous les espaces (ou tout autre caractère que vous spécifiez) à partir de votre string.

2

C'est parce que 1 << (' ' - 'a') est négatif, donc l'int extraite par le bitmask:

(checker & (1 << val)) 

est également négative.

Changer la condition

if ((checker & (1<< val)) != 0) return false; 
         // ^^ Here. 

Cependant vous avez seulement 32 bits à utiliser pour indiquer la détection précédente d'un char, et il y a 65536 valeurs possibles de val: cette méthode échouera très rapidement pour d'autres chaînes.

Par exemple, le procédé prétendrait que "Aa", "R2" et " @" (espace, suivi d'un signe) ont des caractères répétés, ce qui est manifestement faux.

Cela ne arrive à travailler pour "a b c d" en raison de la disposition des codepoints ASCII - l'espace arrive juste à ne pas entrer en collision avec l'un des autres symboles de la chaîne, modulo 32.