1. 程式人生 > 其它 >python實現只出現一次的數字

python實現只出現一次的數字

技術標籤:python實現LeetCode之陣列篇列表python資料結構leetcode演算法

目錄

問題描述

給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

說明:

你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

輸入: [2,2,1] 輸出: 1 示例 2:

輸入: [4,1,2,1,2] 輸出: 4

來源:力扣(LeetCode) 連結:https://leetcode-cn.com/problems/single-number
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

1.基本思想

  (1):將list排序,兩兩一組比較,若不相等,則返回第一個數字;否則就返回最後一個數字;
  (2):將list按奇數偶數位置拆分成兩個set求差集,則差集中值就是最終的結果。

2.1常規法

# -*- coding: utf-8 -*-
'''
問題簡述:
    給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了兩次,
    找出那個只出現一次的元素。
基本思路:
    將陣列排序,兩兩一對元素肯定相等,若不相等,則返回第一個不相等元素;
    或者最後一個元素就是隻出現一次的數字。
'''
class Solution():
    '''
    input: list
    output: int
    '''
def singleNumber(self,nums): nums.sort() # 排序 if len(nums) == 1: # 若僅包含一個元素,則一定是僅出現一次的元素 return nums[0] i=0 while i<len(nums)-2: # 假設len(nums) = 5,那麼最後一組下標為2就該停止,所以i=0,2,故 i< 5-2=3即可。 if nums[i] != nums[i+1]: return
nums[i] else: i = i+2 return nums[-1] # 假若沒找到,則最後一個元素就是不重複元素。 if __name__ == '__main__': ilist = [4,1,2,3,1,2,3] solu = Solution() res = solu.singleNumber(ilist) print('單個數字為:\n',res)

2.2集合法

# -*- coding: utf-8 -*-
'''
問題簡述:
    給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了兩次,
    找出那個只出現一次的元素。
基本思路:
    給陣列排序,按照奇數偶數將list分成兩個集合,之後求兩個集合的差集就是孤零零的元素。

'''
class Solution():
    '''
    input: list
    output: int
    '''
    def singleNumber(self,nums):
        nums.sort()     # 排序
        res = list(set(nums[::2]) - set(nums[1::2]))
        return res[0]

if __name__ == '__main__':
    ilist = [4,1,2,3,1,2,3]
    solu = Solution()
    res = solu.singleNumber(ilist)
    print('單個數字為:\n',res)

總結

a. 在第一種方法中:注意list長度為1的特殊情況;i下標索引的範圍i<len-2;最後迴圈中沒有出現單個元素,則return nums[-1]。
b. 在集合中,不能通過集合進行索引,即set[i]。這種索引方式是錯誤的。因此集合是無序的,不能索引。報錯資訊為:TypeError: ‘set’ object is not subscriptable。即型別錯誤,不能出現索引。只能通過list()方法將其轉化成列表才可進行索引。