【问题标题】:smallest letter greater than target大于目标的最小字母
【发布时间】:2021-04-08 07:00:45
【问题描述】:

我编写了一个代码,旨在返回target 字母h 之后的最小字母,所以在这种情况下,它是i。但是,下面的代码不会产生输出。有任何想法吗?我感觉问题出在第一个 if 声明中。

letters = [
    'a',
    'b',
    'c', 'c', 'c', 'c',
    'd',
    'e', 'e', 'e',
    'g',
    'h', 'h', 'h',
    'i',
    'j',
    'k', 'k', 'k',
    'l',
    'm',
    'n',
    'o',
    'p', 'p', 'p',
    'q',
    'r',
    's', 's',
    't'
]

target = 'h'
left = 0
right = len(letters) - 1
mid = left + (right - left) // 2

while left < right:
    if mid == target:
        for i in range(letters[mid], letters[len(letters)]):
            if letters[i] != target:
                print(letters[i])
                break

    if letters[mid] < target:
        left = mid + 1
    elif letters[mid] > target:
        right = mid - 1

【问题讨论】:

  • 您需要在while 循环内(重新)计算mid,否则它始终保持其初始值。
  • 不相关,但您可以定义letters = 'abccccdeeeghhhijkkklmnopppqrsst' 并仍将其用作数组。
  • 你可以用一个班轮letters[len(letters) - letters[::-1].index('h')]

标签: python sorting letter


【解决方案1】:
letters =     ['a','b','c','c','c','c','d','e','e','e','g','h','h','h','i','j','k','k','k','l','m','n','o','p','p','p','q','r','s','s','t']

target = 'h'

# Find only after target
letters = letters[letters.index(target):]

# Remove target from list
letters = [x for x in letters if x != target]

# Sort list
letters.sort()

# Find char representation of lowest
print(letters[0])

【讨论】:

  • 不错的解决方案,但您不需要那些 ord()chr() 来回转换。
  • 另外letters = 'abccccdeeeghhhijkkklmnopppqrsst' 会更 Pythonic。
  • 那么 [:letters.index(target)] 在 target 之前返回每个?
  • @PiotrŻak 是的,看看tutorialspoint.com/What-does-colon-operator-do-in-Python 了解更多使用方法。
【解决方案2】:

如果你喜欢单线

letters[len(letters) - letters[::-1].index('h')]

代码从反向列表中获取第一个字母“h”的索引,并用它找到字母“h”之后的第一个

【讨论】:

  • 不是不可读,但提供简短的描述会更好。
  • 不错。你的答案看起来不错。感谢编辑
【解决方案3】:

另一种解决方案

OrderedDict可以用来创建有序的唯一列表,这个列表可以用来获取目标元素的索引。

from collections import OrderedDict
ordered_unique_list=list(OrderedDict.fromkeys(letters))
print(ordered_unique_list[ordered_unique_list.index(target)+1])

输出

i

【讨论】:

    【解决方案4】:

    这样就可以了;)

    letters = ['a', 'b', 'c', 'c', 'c', 'c', 'd', 'e', 'e', 'e', 'g', 'h', 'h', 'h', 'i', 'j', 'k', 'k', 'k', 'l', 'm', 'n',
           'o', 'p', 'p', 'p', 'q', 'r', 's', 's', 't']
    
    target = 'h'
    left = 0
    right = len(letters) - 1
    mid = (left + right) // 2
    
    while left <= right:
        if letters[mid] == target:
            for i in range(mid, len(letters)):
                if letters[i] != target:
                    print(letters[i])
                    break
            break
    
        if letters[mid] < target:
            left = mid + 1
        elif letters[mid] > target:
            right = mid - 1
    
        mid = (left + right) // 2
    

    【讨论】:

      【解决方案5】:

      right = len(letters) -1
      这将始终返回相同的答案,因为它始终计算数组中的字母数:

      https://www.w3schools.com/python/ref_func_len.asp

      【讨论】:

      • 可以使用反勾来进行代码格式化
      猜你喜欢
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      相关资源
      最近更新 更多