簡體   English   中英

大於目標的最小字母

[英]smallest letter greater than target

我編寫了一個代碼,目的是返回target字母h之后的最小字母,所以在這種情況下,它是i 但是,下面的代碼不會產生 output。 有任何想法嗎? 我感覺問題出在第一個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
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])

如果你喜歡單線

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

代碼從反向列表中獲取第一個字母“h”的索引,並使用它找到字母“h”之后的第一個

right = len(letters) -1
這將始終返回相同的答案,因為它始終計算數組中的字母數:

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

另一個解決方案

OrderedDict可用於創建有序唯一列表,此列表可用於獲取目標元素索引。

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

Output

i

這樣就可以了;)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM