【问题标题】:Find the unique number - Codewars找到唯一的号码 - Codewars
【发布时间】:2022-01-15 01:46:52
【问题描述】:

我正在尝试在 Codewars 上完成这个 kata:

这是我的代码建议:

import numpy as np

def find_uniq(arr):
    search_array = np.array(arr)
    print(search_array)
    unique = 0
    for number in search_array:
        if number != search_array[0]:
            unique = number
    print(unique)
    return unique

以下是发生的情况:

1 - 我按“测试”:

2 - 我按“尝试”:

所以,我无法完成这个该死的 kata,因为存在“1 应该等于 0 的问题”。 我已经浪费了很多时间来思考这可能有什么问题,我要放弃了:(

想法?

【问题讨论】:

标签: python arrays numpy search unique


【解决方案1】:

您的代码假设与第一个数字不相等的数字是唯一数字,当第一个数字是唯一数字时会遇到问题。 您还需要检查第二个数字是否等于第三个数字,以确定第一个数字是否可能是唯一数字。

您也可以使用:

for number in search_array:
    counter = search_array.count(search_array[number])
    if counter == 1:
        return number
        break

【讨论】:

    【解决方案2】:

    正如其他用户所解释的,您仅将每个元素与列表中的第一个元素进行比较,因此如果第一个元素是唯一的,那么您的代码将无法正常工作。

    我解决这个问题的方法是创建一个新列表,几乎等于原来的列表,但改变如下:

    original=[3,3,4,3,3]
    new=[3,4,3,3,3]
    

    因此,如果您计算“原始-新”,您会得到一个列表,其中几乎所有数字都等于 0,除非唯一数字在两个列表中。

    您可以按如下方式创建新列表:

    new=original[1:] #all elements, except the first
    new.append(original[0]) #appends the first element in the original to the last position
    
    compare=[original[i]-new[i] for i in range(len(original))]
    

    比较=[0,-1,1,0,0]

    你可以得到索引:

    indexes=[i for i in range len(original) if original[i]-new[i]!=0]
    

    索引=[1,2]

    当我将原始列表向左移动时,唯一编号的索引是最后一个。

    所以,唯一编号是:

    unique=original[indexes[-1]]
    

    我测试的完整代码:

    #Creates a random list with a unique number in a random position    
    n=1000000
    a=[random.uniform(0,1)]*n
    pos=round(random.uniform(0,n-1))
    a[pos]=random.uniform(0,1)
    
    #Creates the new list to compare
    b=a[1:]
    b.append(a[0])
    
    #Finds the unique number
    unique=a[[i for i in range(len(a)) if a[i]-b[i]!=0][-1]]
    

    如果你使用 Numpy,你可以获得 3.5 倍的代码:

    array_a=np.array(a)
    array_b=array_a[1:]
    array_b=np.append(array_b,array_a[-1])
    compare=array_a-array_b
    unique=array_a[compare!=0][-1]
    

    您好。

    【讨论】:

      【解决方案3】:

      您正在做的是将每个数字与数组的第一个数字进行比较。因此,如果唯一编号不是第一个,则它可以工作,但当它是第一个时,它会失败。

      我建议你初始化 search_array[0] 的 unique 并在第二个元素处开始你的 for 循环。

      那么……想想吧!也许您可以对您的 search_array 进行排序,也许您可​​以将临时唯一数字存储在数组中... :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-06
        • 1970-01-01
        • 1970-01-01
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多