zoukankan      html  css  js  c++  java
  • 数组题汇总(python3)

    题目主要来自《剑指offer》和LeetCode,用python3来写的代码。

    1、二维数组的查找:

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    # -*- coding:utf-8 -*-
    class Solution:
        
        def Find(self, target, array):
            rows = len(array)-1
            cols = len(array[0])-1
            i = rows
            j = 0
            while i >= 0 and j <= cols:
                if target < array[i][j]:
                    i -= 1
                elif target > array[i][j]:
                    j += 1
                else:
                    return True
            return False

    2、旋转数组的最小数字

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

    # -*- coding:utf-8 -*-
    class Solution:
        def minNumberInRotateArray(self, rotateArray):
            lens = len(rotateArray)
            if lens == 0:
                return 0
            elif lens == 1:
                return rotateArray[0]
            else:
                left = 0
                right = lens-1
                while left < right:
                    mid = (left+right)//2
                    if rotateArray[mid] <= rotateArray[right]:
                        right = mid
                    else:
                        left = mid+1
                return rotateArray[right]

    3、斐波那契数列

    大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。

    # -*- coding:utf-8 -*-
    class Solution:
    
        def Fibonacci(self, n):
            fib = [0,1]
            if n <= 1:
                return fib[n]
            
            while len(fib)<=n:
                fib.append(fib[-1]+fib[-2])
            return fib[n]

    4、跳台阶

    一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

    # -*- coding:utf-8 -*-
    class Solution:
    
        def jumpFloor(self, number):
            ways = [1,2]
            if number <= 2:
                return ways[number-1]
            
            while len(ways)<=number:
                ways.append(ways[-1]+ways[-2])
            return ways[number-1]

    5、变态跳台阶

    这道题纯粹是为了和前一题对比,放在数组这篇博客里。一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

    # -*- coding:utf-8 -*-
    class Solution:
        def jumpFloorII(self, number):
            if number <=1:
                return number
            else:
                way = 1
                for i in range(2,number+1):
                    way *= 2
                return way

    6、矩形覆盖

    和斐波那契数列的思路差不多。我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

    # -*- coding:utf-8 -*-
    class Solution:
        def rectCover(self, number):
            ways = [0,1,2]
            if number <= 2:
                return ways[number] 
            else:
                while len(ways) <= number:
                    ways.append(ways[-1]+ways[-2])
                return ways[number]

    7、数值的整数次方

    给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

    # -*- coding:utf-8 -*-
    class Solution:
        def Power(self, base, exponent):
            temp = 1
            if base == 0:    
                return 0
            elif base != 0 and exponent == 0:
                return 1
            elif base!= 0 and exponent > 0:
                for i in range(exponent):
                    temp *= base
                return temp
            else:
                for i in range(-exponent): 
                    temp *= 1./ base       
                return temp

    8、调整数组顺序使奇数位于偶数前面

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

    # -*- coding:utf-8 -*-
    class Solution:
        def reOrderArray(self, array):
            if not array:
                return []
            odd_list = []
            even_list = []
            for i in array:
                if i % 2 != 0:
                    odd_list.append(i)
                else:
                    even_list.append(i)
            return odd_list+even_list

    9、顺时针打印矩阵

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

    # -*- coding:utf-8 -*-
    class Solution:  
        def printMatrix(self, matrix):
            res = []
            while matrix:
                res += matrix.pop(0)
                if matrix and matrix[0]:
                    for row in matrix:
                        res.append(row.pop())
                if matrix:
                    res += matrix.pop()[::-1]
                if matrix and matrix[0]:
                    for row in matrix[::-1]:
                        res.append(row.pop(0))
            return res

    10、数组中出现次数超过一半的数字

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

    # -*- coding:utf-8 -*-
    class Solution:
        def MoreThanHalfNum_Solution(self, numbers):
            if not numbers:
                return 0
            lens = len(numbers)
            count_freq = {}
            for i in numbers:
                if i not in count_freq:
                    count_freq[i] = 1
                else:
                    count_freq[i] += 1 
            for key,value in count_freq.items():
                if value > (lens//2):
                    return key
            return 0

    11、连续子数组的最大和

    HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)。

    借鉴自然语言处理中的ngram的做法。

    # -*- coding:utf-8 -*-
    class Solution:
        def FindGreatestSumOfSubArray(self, array):
            
            def get_ngram(array):
                n = len(array)
                m = 1
                n_gram = [array[i-k:i] for k in range(m,n+1) for i in range(k,n+1)]            
    return n_gram def find_max(array): n_gram = get_ngram(array) sum_n_gram = [sum(i) for i in n_gram] max_sum = sum_n_gram[0] for i in sum_n_gram: if i >= max_sum: max_sum = i return max_sum if not array: return else: return find_max(array)

    12、把数组排成最小的数

    输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

    这个题在python3环境下,要调用一个函数cmp_to_key。

    # -*- coding:utf-8 -*-
    from functools import cmp_to_key
    class Solution:
        def PrintMinNumber(self, numbers):
            if not numbers:
                return ''
            def compare(a,b):
                if a+b > b+a:
                    return 1
                elif a+b < b+a:
                    return -1
                else:
                    return 0
            numbers = [str(i) for i in numbers]
            numbers.sort(key=cmp_to_key(compare))
            return ''.join(numbers).lstrip('0')

    13、丑数

    把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

    这道题真是神题,暂时理解不了,抄别人的代码。

    # -*- coding:utf-8 -*-
    class Solution:
        def GetUglyNumber_Solution(self, index):
            if index < 1:
                return 0
            res = [1]
            t2=t3=t5=0
            nextIdx = 1
            while nextIdx < index:
                minNum=min(res[t2]*2,res[t3]*3,res[t5]*5)
                res.append(minNum)
                if res[t2]*2 == minNum:
                    t2 += 1
                if res[t3]*3 == minNum:
                    t3 += 1
                if res[t5]*5 == minNum:
                    t5 += 1
                nextIdx += 1
            return res[nextIdx-1]

    待续...

  • 相关阅读:
    【bzoj1688】[USACO2005 Open]Disease Manangement 疾病管理 状态压缩dp+背包dp
    【bzoj1231】[Usaco2008 Nov]mixup2 混乱的奶牛 状态压缩dp
    ContentPresenter元素
    ContentControl和ContentPresenter的应用
    ItemsControl的应用
    ItemsControl的ItemContainerStyle属性
    WPF:理解TileBrush(ImageBrush,DrawingBrush和VisualBrush)
    Stretch的Uniform和UniformToFill
    VisualBrush
    关于.net4.0中的Action委托
  • 原文地址:https://www.cnblogs.com/Luv-GEM/p/11082721.html
Copyright © 2011-2022 走看看