Python刷题:简单数组(一)

这是一个简单的说明性帖子,题目是它挑选的。

1.Two Sum

    Given an array of integers, return indicesof the two numbers such that they add up to a specific target. You may assumethat each input would have exactly one solution, and may not use the sameelement twice.

    给定由整数组成的数组,使用数组中的两个数字相加拼凑出一个特定的数字,找到这两个数字后返回每个数字在数组中的索引。求解时,必须保证任意输入只有一个精确解,并且数组中的每个数字只能被使用一次。

例如:

Given(给定) nums = [2, 7, 11, 15], target(目标) = 0;

Because(由于) nums[0] + nums[1] = 2 + 7 = 0;

Return [0, 1].

问题分析:求解该问题时首先必须获知每个数组素银所对应的数字,因此应当使用字典将它们联合存储在一起,之后使用嵌套的两层遍历来求取两个具体的数字,从而比照字典输出索引值。 

程序:

def twosum(nums, target):
	"""
		:type nums: List[int]
		:type target: int
		:Return_type List[int]
	"""    #三个双引号之间的为函数功能描述,实际不运行。本程序中主要是用来描述函数的输入输出情况
	dic = dict()                                        #使用内置的dict()函数构造一个空字典
	for index, value in enumerate(nums):                #内置函数enumberate()将其参数数组分割为索引与数值两部分,并将结果返回
                                                            #该结果可以被程序结构访问,但不能直接传输给字典变量。
		sub = target - value                        #将目标数字target分割为两部分以满足两数相加之和等于target的要求
		if sub in dic:                      
			return(dic[sub], index)             #最后的结果返回
		else:
			dic[value] = index                  #该语句是在第一次遍历一个新的数据时,将数据存储到字典当中,这样设计的好处
                                                            #在于只要找到目标数据对后,给定数组中未遍历过的数据就不会被添加至字典中当
                                                            #有效降低了预算量。		

2.Remove Duplicates fromSorted Array

    Given a sorted array, remove the duplicatesin place such that each appear only once and return the new length. Do notallocate extra space for another array, you must do this in place with constantmemory.

    给定一个有序的数组,将该数组中出现的重复数据删减,是数组中的每个数据仅出现一次,最后返回新数组的长度。不允许占用内存空间构建新的数组,你必须使用原址操作配合少量固定的内存空间。

示例:

    给定一个矩阵nums = [1, 1, 2]

    构造的函数应当返回length = 2,并且数组中的前两个元素第一个为1,第二个为2。

问题解析:由于数组是有序的,在原数组的基础上创建两个变量i,j分别记录当前扫描要扫描的数字以及修改后的无重复数字的最后一个元素,如果nums[i]不等于nums[j],我们认为nums[i]为一个新的非重复数字,将其值赋给nums[j+1]。这样,当整个数组被遍历一遍后,后一变量就划定了新数组的范围,之后我们可以帮后面的数组元素弹出去,就可以构造出题目要求的数组。

程序:

def remove_duplicates(nums):
	"""
		:type nums: List[int]
		:rtype int
	"""#功能描述,这是一个注释,因为别人都有,所以还是加上它。
	for i in range(len(nums)):            #构造一个遍历数组,其长度与给定数组nums长度相同,它是用来进行for遍历的
		if i == 0:                    #为新数组的索引变量赋初值,使其对应第一个元素
			j = 0 
		if nums[i] != nums[j]:        #如果当前遍历元素的值与新数组索引所对应的数值不相同,就认为该数字为新出现的非重复数字
			j = j+1
			nums[j] = nums[i]
	for x in range(len(nums) - j):        #剔除新数组最后的重复混乱部分,是新数组只保留有效值
		if x != 0:
			nums.pop()
	return(len(nums))

那么,问题来了,如果nums数组为空的话,该程序要正确运行,应该怎样修改呢?

3.Remove Element

    Given an array and a value, remove allinstances of that value in place and return the new length. Do not allocate extraspace for another array. you must do this in place with constant memory. Theorder of elements can be changed, it doesn’t matter what you leave beyond thenew length.

    给定一个数组与一个值,移除数组内与该值相同的元素,最终返回数组新的长度。不能创建新的数组,仅允许使用有限个变量。元素的顺序可以被改变,并且以新的长度为索引之外的元素不作考虑,其可以为任意值。

示例:

给定一个输入数组 nums= [3, 2, 2, 3],给定值 val = 3。

你的函数应当返回length= 2,并且nums的前两个元素应该都是2。

问题解析:实质上就是遍历数组,把数组中的每个元素都与给定值对比,将与给定值相同的元素剔除在新的长度内。

程序:

def remove_element(nums, val):
	length = 0                                #用来标记最终长度和数组修改的变量
	for i in range(len(nums)):                #使用for结构配合range()函数实现数组遍历
		if nums[i] != val:         
			nums[length] = nums[i]    #如果当前遍历的元素不等于标定值,我们认定该值有效,把这个值赋到数组有效位当中
			length += 1               #由于一个新的有效值被赋值成功,数组的新有效长度加一
	return length

4.Search Insert Position

    Given a sorted array and a target value,return the target is found. If not, return the index where it would be if itwere inserted in order. You may assume no duplicates in the array.

    给定一个有序数组和一个目标值,返回该目标值在数组中的索引。如果数组中没有该值,确定该值应当被插入有数数组的那个位置,返回该位置的索引值。你可以假设数组中无重复元素。

示例:

[1, 3, 5, 6], 5      返回2

[1, 3, 5, 6], 2      返回1

[1, 3, 5, 6], 7      返回4

[1, 3, 5, 6], 0      返回0

题目解析:该问题是一个搜索问题,由于原数组有序且无重复,因此可以利用这一特性进行算法优化。

程序:

def search(nums, val):                        #数组全遍历,简单无脑暴力操作;并且,只适用于升序数组
	for i in range(len(nums)):
		if nums[i] < val:             #对于比val小的数值,一直都记录,防止val在数组中未出现以至于没有返回值
			index = i + 1
		elif nums[i] == val:          #如果val出现了,不要犹豫,你找的就是它
			index = i
	return(index)

5.Maximum Subarray

    Find the contiguous subarray within anarray(containing at least one number)which has the largest sum.

    在数组中找出一个连续的子数组,该子数组至少包含一个数字,并且其所有元素之和最大。

示例:

给定数组[-2, 1,-3, 4, -1, 2, 1, -5, 4],得出子数组[4, -1, 2, 1]由最大的和值sum = 6。

程序:

import math                                                    #由于要用到无穷量inf,因此导入模块math
def Subarray(nums):
	max_sum = -math.inf                                    #将最大值的初始值定为无穷小,这是为了防止给定数组全为负值的情况,
                                                               #当然,也可以不给定初始值,在遍历数组的过程中,一第一个元素的值为初始值
	m_s_index = 0                                          #确定最大子数组开始的元素索引,方便确定最大子数组的最大值后找到它
	current_sum = -math.inf                                #遍历时当前子数组总合值,是为了作为中间过度,不断的与已知最大值进行比较
	c_s_index = 0                                          #当前子数组的起始索引
	x = 0                                                  #while判别里的参数
	subarray = []                                          #最后输出的子数组就存放在这里
	for i in range(len(nums)):
		if(nums[i] > (current_sum + nums[i])):         #该判定是用来确定当前进行的子数组查询是否可以停止,如果累计值小于当前
                                                               #扫描的元素,这就意味着子数组的起始索引可以被修改了
			current_sum = nums[i]
			c_s_index = i
		else:
			current_sum = current_sum + nums[i]
		
		if(max_sum < current_sum):                     #不断地在当前子数组中筛选出最大子数组
			max_sum = current_sum
			m_s_index = c_s_index
	
	while(x != max_sum):                                   #拼凑出最大子数组
		subarray.append(nums[m_s_index])
		x += nums[m_s_index]
		m_s_index += 1
	
	return(max_sum, subarray)







你可能感兴趣的:(Python刷题提升解析)