/ / Znalezienie pierwszego niepowtarzalnego znaku w ciągu za pomocą Swift - swift

Odnajdywanie pierwszej nie powtarzającej się litery w ciągu znaków za pomocą Swift - swift

Znajduje duplikaty w tablicy, ale jestemszukam czegoś, co znajdzie pierwszy niepowtarzalny znak w ciągu. Próbowałem wymyślić sposób, aby to zrobić i nie mogę tego rozgryźć.

var strArray = ["P","Q","R","S","T","P","R","A","T","B","C","P","P","P","P","P","C","P","P","J"]

println(strArray)

var filter = Dictionary<String,Int>()
var len = strArray.count
for var index = 0; index < len  ;++index {
var value = strArray[index]
if (filter[value] != nil) {
strArray.removeAtIndex(index--)
len--
}else{
filter[value] = 1
}
}
println(strArray)

Odpowiedzi:

5 dla odpowiedzi № 1

Aby stwierdzić, czy znak się powtarza, przejrzyj całą tablicę raz, zwiększając liczbę wystąpień w słowniku:

let characters = ["P","Q","R","S","T","P","R","A","T","B","C","P","P","P","P","P","C","P","P","J"]

var counts: [String: Int] = [:]
for character in characters {
counts[character] = (counts[character] ?? 0) + 1
}


let nonRepeatingCharacters = characters.filter({counts[$0] == 1})
// ["Q", "S", "A", "B", "J"]
let firstNonRepeatingCharacter = nonRepeatingCharacters.first!
// "Q"

0 dla odpowiedzi nr 2

Oto sposób, w jaki udało mi się wykryć pierwszą nie powtarzającą się postać. Usuwa spacje i znaki interpunkcyjne, aby znaleźć rzeczywistą literę lub cyfrę, która się nie powtarza.

extension String {

func removeNonAlphaNumChars() -> String {
let charSet = NSCharacterSet.alphanumericCharacterSet().invertedSet

return self
.componentsSeparatedByCharactersInSet(charSet)
.joinWithSeparator("")
}

var firstNonRepeatedCharacter: Character? {
let alphaNumString = self.removeNonAlphaNumChars()

let characters = alphaNumString.characters
let count = characters.count
guard count > 0 else { return nil }

// Find unique chars
var dict: [Character: Int?] = [:]
for (index, char) in characters.enumerate() {
if dict[char] != nil {
dict[char] = (nil as Int?)
}
else {
dict[char] = index
}
}

return dict.filter { $0.1 != nil }.sort { $0.1 < $1.1 }.first?.0
}
}

0 dla odpowiedzi № 3
func firstNonRepeatedCharacter(input: String) -> Character?{
var characterCount : [Character : Int] = [:]
var uniqueCharacter: Character?

for character in input{
if let count = characterCount[character]{
characterCount[character] = count + 1
if(uniqueCharacter == character)
{
uniqueCharacter = nil
}
}
else{
characterCount[character] = 1
if(uniqueCharacter == nil){
uniqueCharacter = character
}
}
}
return uniqueCharacter
}

Bez dodatkowej pętli, aby znaleźć znak ze słownika characterCount