lintcode入门篇二

一. 最大子数组

给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。

样例

样例1:

输入:[−2,2,−3,4,−1,2,1,−5,3]
输出:6
解释:符合要求的子数组为[4,−1,2,1],其最大和为 6。

样例2:

输入:[1,2,3,4]
输出:10
解释:符合要求的子数组为[1,2,3,4],其最大和为 10。

挑战

要求时间复杂度为O(n)

注意事项

子数组最少包含一个数

输入测试数据 (每行一个参数)如何理解测试数据?
第一种解法:O(n)时间复杂度
class Solution:
    """
    @param nums: A list of integers
    @return: A integer indicate the sum of max subarray
    """
    def maxSubArray(self, nums):
        # write your code here
        '''
        做两步判断:
        1.第一步判断:当n > 0 的时候,继续加。如果n小于0,则n取最新的数,之前的舍弃
        2.第二步判断:sum 和 继续加的n作比较,如果sum < n,那么sum = n,否则sum保持。
        
        '''
        sum = nums[0]
        n = nums[0]
        for i in range(1,len(nums)):
            if n > 0:
                n = n + nums[i]
            else:                  #一旦n < 0,舍弃,取新的值n进行继续相加
                n = nums[i]
            if sum < n: 
                sum = n
        return sum

第二种解法:O(n2)时间复杂度

def  MaxSumArray(nums):
    '''
    1.取出所有符合条件的顺序数组
    2.然后将所有顺序数组的值放在一个大的数组[]里面,最后返回里面的最大值max
    :param nums:
    :return:
    '''
    array = []
    for i in range(len(nums)):
        for j in range(i + 1,len(nums)):
            array.append(sum(nums[i:j]))
    return  max(array)
result = MaxSumArray([-2,2,-3,4,-1,2,1,-5,3])
print(result)

二. 最小子数组

给定一个整数数组,找到一个具有最小和的连续子数组。返回其最小和。

样例

样例 1

输入:[1, -1, -2, 1]
输出:-3

样例 2

输入:[1, -1, -2, 1, -4]
输出:-6

注意事项

子数组最少包含一个数字

class Solution:
    """
    @param: nums: a list of integers
    @return: A integer indicate the sum of minimum subarray
    """
    def minSubArray(self, nums):
        # write your code here
        '''
        1.负数一直相加,一旦大于0,则被替换
        2.sum 记录之前保存最小值的和,如果一旦有出现更小的和的话,则被替换
        :param nums:
        :return:
        '''
        n = nums[0]
        sum = nums[0]
        for i in range(1,len(nums)):
            if n < 0:
                n = n + nums[i]
            else:
                n = nums[i]
            if sum > n:
                sum = n
        return sum 

三. 数组剔除元素后的乘积

中文English

给定一个整数数组A。
定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法。请输出B。

样例

样例 1

输入: A = [1, 2, 3]
输出: [6, 3, 2]
解析:B[0] = A[1] * A[2] = 6; B[1] = A[0] * A[2] = 3; B[2] = A[0] * A[1] = 2
class Solution:
    """
    @param: nums: Given an integers array A
    @return: A long long array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1]
    """
    def productExcludeItself(self, nums):
        # write your code here
        array = []
        for i in range(len(nums)):
            sum = 1
            for j in range(len(nums)):
                if i != j:
                    sum = sum * nums[j]
            array.append(sum)
        return array

四. 翻转字符串中的单词

给定一个字符串,逐个翻转字符串中的每个单词。

样例

样例  1:
	输入:  "the sky is blue"
	输出:  "blue is sky the"
	
	样例解释: 
	返回逐字反转的字符串.

样例 2:
	输入:  "hello world"
	输出:  "world hello"
	
	样例解释: 
	返回逐字反转的字符串

说明

  • 单词的构成:无空格字母构成一个单词,有些单词末尾会带有标点符号
  • 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
  • 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个
输入测试数据 (每行一个参数)如何理解测试数据?
输出: "world hello" 样例解释: 返回逐字反转的字符串. 

说明

  • 单词的构成:无空格字母构成一个单词,有些单词末尾会带有标点符号
  • 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
  • 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个
class Solution:
    """
    @param: s: A string
    @return: A string
    """
    def reverseWords(self, s):
        # write your code here
        array = s.split(' ')
        new_s = ''
        for i in range(len(array)):
            if array[i] != '':
                new_s = array[i] + ' ' + new_s
        return new_s

注释:

1.'hello word  xiao li '.split(' ') 结果为['hello','',world','','','xiao','','li','']

五. 比较字符串

比较两个字符串A和B,确定A中是否包含B中所有的字符。字符串A和B中的字符都是 大写字母

样例

给出 A = "ABCD" B = "ACD",返回 true

给出 A = "ABCD" B = "AABC", 返回 false

注意事项

在 A 中出现的 B 字符串里的字符不需要连续或者有序。

class Solution:
    """
    @param A: A string
    @param B: A string
    @return: if string A contains all of the characters in B return true else return false
    """
    def compareStrings(self, A, B):
        # write your code here
        for n in B:
            if n not in A:
                return False
            A = A.replace(n,'',1) ##每次校验完之后,要去除掉首个校验通过的字符(即校验在A里面的字符,字符位置不固定,但固定是首次出现的字符)
        return True

注释:

对于A,B分别为'ABCD'和'AACD'的特殊情况,如果每次判断完,不进行去除的话,则会返回True。只有每次判断完,之后去除掉当前的首个判断成功的字符,才可以正确判断出结果。

 

posted @ 2020-01-12 00:44  风不再来  阅读(243)  评论(0编辑  收藏  举报