Python 编写一个函数,返回在字符串中出现奇数次的第一个元素

Python 编写一个函数,返回在字符串中出现奇数次的第一个元素,python,Python,我想写一个函数,返回字符串中出现奇数次的第一个元素 我知道有一些代码可以返回奇数次元素,我尝试将其应用于字符串,但没有太大成功: def getOddOccurrence(arr, arr_size): for i in range(0,arr_size): count = 0 for j in range(0, arr_size): if arr[i] == arr[j]: count+=1

我想写一个函数,返回字符串中出现奇数次的第一个元素

我知道有一些代码可以返回奇数次元素,我尝试将其应用于字符串,但没有太大成功:

def getOddOccurrence(arr, arr_size): 
    for i in range(0,arr_size): 
        count = 0
        for j in range(0, arr_size): 
            if arr[i] == arr[j]: 
                count+=1
              
        if (count % 2 != 0): 
            return arr[i] 
          
    return -1
驱动程序代码:

arr = ["Hello world!"] 
n = len(arr) 
print(getOddOccurrence(arr, n))
# Output: "Hello world!

如果给定字符串
“Hello world!”
,如何返回出现奇数次的第一个元素?

返回出现奇数次的第一个元素:

def getOddOccurrence(myString):
    for letter in myString:
        letter_count = myString.count(letter)
        if letter_count%2 != 0:
            return letter
    return None
      
      
# driver code  
myString = "Hello world!"
print(getOddOccurrence(myString))

输出:“H”

您可以使用集合中的计数器获取字符数,然后只查找第一个奇数字符:

from collections import Counter
def firstOdd(S):
    return next((c for counts in [Counter(S)] for c in S if counts[c]%2),"")

print(firstOdd("Hello World")) # 'H'

print(firstOdd("bold World Wide Web")) # 'd'

由于讨论了如何提供优化的解决方案,这里是: 这个构建基于@SowjanyaRBhat的代码并对其进行了优化。与@OneCriketeer提到的差不多

空间复杂性:O(N)
时间复杂度:O(N)

方法1:无
集合。计数器

from collections import defaultdict


def getOddOccurrence(myString):
    count = defaultdict(int)
    for letter in myString:
        count[letter] += 1
    for letter in myString:
        if count[letter] % 2 != 0:
            return letter
方法2:使用
集合。计数器

from collections import defaultdict


def getOddOccurrence(myString):
    count = defaultdict(int)
    for letter in myString:
        count[letter] += 1
    for letter in myString:
        if count[letter] % 2 != 0:
            return letter
(检查@Alain.T答案中的“酷一号”衬里)


奇数次令人困惑。你能分享一下你对
“Hello world!”
的期望输出吗?首先,如果你只想检查一个字符串,为什么要传递一个列表?当前,您没有比较该字符串的任何字符,只有列表中的元素
“Hello World”->“H”
“llo World”->“l”是您期望的输出吗?当您从0到n运行两个循环时,您错误地计算了出现在同一索引中的元素。是的,在这种情况下,我希望是H。更优化的解决方案是避免在循环中使用
。count
我不知道该怎么做!非常感谢!:)删除了字符串上的第二个lineLoop一次。将字符计数放入字典。在字符串上循环两次,然后返回带有奇数计数的第一个dict值。O(N)解决方案而不是此O(N^2)函数的前3行可以替换为
count=collections.Counter(myString)
…非常感谢!为了让我正确理解这一点,dictionary函数的使用就像散列一样?然后它回过头来寻找出现的第一个奇数字母?感谢大家反应如此之快——没想到!:)对这是一个两遍的解决方案。在第一个循环中,我们使用字典来维护字符数;在第二个循环中,我们检查第一个奇数字符。感谢您的澄清-今天刚刚学习了散列,所以在实践中看到它很高兴:)太棒了!我喜欢它的简洁,你举了两个例子!我很感激,谢谢!