1. 程式人生 > >Python刷題:簡單陣列(三)

Python刷題:簡單陣列(三)

11.Best Time to Buy and sellStockⅡ

    Say you have an array for which the ithelement is the price of a given stock on day i.

    Design an algorithm to find the maximum profit.You may complete as many transactions as you like(ie. buy one and sell oneshare of the stock multiple times). However, you may not engage in multipletransactions at the same time( ie. you must sell the stock before you buy again).

    你有一個數組,陣列中的第i個元素的值代表了給定股票在第i天時的價格。

    設計一個演算法找出最大的收益。你可以任意進行多次交易,但是需保證在每次購買時不持有任何股票。

題目解析:由於題目不限制買賣次數,只要求每次購買時不持有股票,因此只要在區域性最低點,最高點賣出,將這個操作持續於整個週期內就可以了。

程式:

def stock(prices):
	return(sum(max(prices[i+1] - prices[i], 0) for i in range(len(prices)-1)))

12.Two SumⅡ- Input array issorted

    Given an array of integers that is alreadysorted in ascending order, find two numbers such that they add up to a specifictarget number. The function twoSum should return indices of the two numberssuch that they add up to the target, where index1 must be less than index2. Youmay assume that each input would have exactly one solution and you may not usethe same element twice.

    給定一個整數陣列,該陣列元素升序排列,在該陣列中找出兩個數字,這兩個數字相加可得到給定的目標數字。該函式返回上述兩個數字的索引值,並且索引值index1必須小於索引值index2.假定每一個輸入都存在解,且解唯一,同一個數字不能被使用兩次。

示例:

輸入:numbers = [2,7, 11, 15], target = 9

輸出:index1 = 1,index2 = 2

題目解析:簡單來講,可以採取先試探選取一個數字,再尋找另一個數字是否存在於該陣列的方法來解決該問題,可以將暴力求解的雙迴圈化簡。

程式:

def twoSum(numbers, target):
	inter = {}                                     #建立空字典,用於儲存陣列中元素值和索引的關係
	for i in range(len(numbers)):
		sub = target - numbers[i]              #邏輯上只用當前值和比當前值更小的值拼湊出目標值
		if sub in inter.keys():
			return[inter[sub]+1, i+1]
		else:
			inter[numbers[i]] = i
	return []

13.Majority Element

    Given an array of size n, find the majorityelement. The majority element is the element that appears more than ⌊n/2⌋ times. You may assumethat the array is non-empty and the majority element always exist in the array.

    給定一個大小為n的陣列,找出佔優元素。該佔優元素是該陣列中出現次數超過陣列元素總數一半的元素。假設該陣列非空且存在佔有元素,求解它。

示例:

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

輸出:1

題目解析:題目核心上就是要統計陣列中每個元素出現的次數,一旦這個次數大於陣列總長的一半,就認為其為佔優元素。

程式:

def maj_ele(nums):
	num = nums[0]                                  #將陣列的第一個元素匯入進去,便於變數定義
	count = 1                                      #元素計數值,不同於以往的累加,該計數值遇到同值元素加一,非同值元素減一
	for i in nums[1:0]:                            #遍歷整個陣列,該方法只能針對佔有元素數目大於陣列長度的一半
		if count == 0:
			num, count = i,1
		else:
			if i == num:
				count = count + 1
			else:
				count = count -1
	return num

14.RotateArray

    Rotatean array of n elements to the right by k steps.

    將長度為n的陣列在第k個索引值處向右旋轉。(根據給定示例猜測)

示例:

給定:n=7, k=3, nums = [1,2,3,4,5,6,7]

輸出:[5,6,7,1,2,3,4]

題目解析:這種翻轉實質上是陣列拼接的一種體現,對於Python來講,十分簡單。

程式:

def rotate(n,k,nums):
	nums[:] = nums[n-k :] + nums[: n-k]

15.Contains Duplicate

    Givenan array of integers, find if the array contains any duplicates. You functionshould return true if any value appears at least twice in the array, and itshould return false if every elements is distinct.

    給定一個整數陣列,如果陣列包含任何重複元素,找出這個陣列。如果該陣列中有值出現至少兩次,你的函式將返回True,如果任何元素都是獨一無二的,返回False。

示例:

輸入:[1,1,3,4] 返回:True

題目解析:簡述主要實現的功能是確認是否有多個元素具備相同值,因此可以在遍歷中判定這個值是否出現過,如果沒有將其嵌入判斷集合,進行下一次遍歷,否則就有結果報出。但是,Python中的set()集合可以簡化這種操作,因為集合元素不可重複,因此可以採用長度判斷法。

程式:

def dup_n(nums):
	if len(nums) == len(set(nums)):
		return False
	else:
		return True