剑指offer (二)

题目描述

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

class Solution:
    def PrintMinNumber(self, numbers):
        if numbers == []:
            return ""
        else:
            numbers = [str(i) for i in numbers]
            numbers.sort(cmp = lambda x,y : int(x+y)-int(y+x))
            return int(''.join(numbers))

这段代码主要参考网上的。

除了  str()是转numner int等类型为字符串,int强制转化为整形数组,以及 ‘ ‘.join(numbers) 把字符数组转化为字符串。

[Python join() 方法用于将序列中的元素(必须是str) 以指定的字符 连接生成一个新的字符串。]

剩下的知识点就是sort排序了。


转自: https://blog.csdn.net/chichoxian/article/details/54948875

python中将一个全部为int的list 转化为str的list

假设有这样一个List

[1,2,3,4,5] 转化为下面这个样子

[‘1’,’2’,’3’,’4’,’5’]

解决方法一:

a = [1,2,3]
b = [ str(i) for i in a ]
1
2
解决方法二:

>>> L = [1,2,3,4,5]
>>> map(str, L)
['1', '2', '3', '4', '5']

所以本题,先转化int为str,这样是为了直接把str连在一起。


map()的用法:
map()函数
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

1、当seq只有一个时,将函数func作用于这个seq的每个元素上,并得到一个新的seq。 

例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9]
如果希望把list的每个元素都作平方,就可以用map()函数:
因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算:
def f(x):
    return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
输出结果:
[1, 4, 9, 10, 25, 36, 49, 64, 81]
注意:map()函数不改变原有的 list,而是返回一个新的 list。

  利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。

map(str,L)就是把L这个序列str()转化为str形式。


sort函数

sorted是内建函数,会生成新的数据。sort()是list才有的函数,只是对原来list改变顺序,不产生新值。python2输入时cmp,python3是key.

《python基础编程》里有讲到一段高级排序:

  “如果希望元素能按照特定的方式进行排序(而不是sort函数默认的方式,即根据python的默认排序规则按升序排列元素,第5章内对此进行讲解),那么可以通过compare(x,y)的形式自定义比较函数。compare(x,y)函数会在x<y时返回负数,在x>y时返回正数,如果x=y则返回0(根据你的定义)。定义好该函数之后,就可以提供给sort方法作为参数了。内建函数cmp提供了比较函数的默认实现方式:

内建函数cmp在python2里使用,python3不再使用。对于sort()方法,如果不传入参数,默认cmp为None,

#升序排列
numbers = [5,2,9,7]
def mycmp1(x,y):
        return x-y
numbers.sort(cmp = mycmp1)
print numbers

>>>
[2, 5, 7, 9]

#降序排列
numbers = [5,2,9,7]
def mycmp2(x,y):
        return y-x
numbers.sort(cmp = mycmp2)
print numbers

>>>
[9,7,5,2]

其中的规律就是:两两比较,如果返回为正,则交换两者的位置,即y在前x在后,否则x在前y在后。也可以这样解释,升序就是拿第一个数比对后面的数,降序就是拿最后一个数比对前面的数。

#升序排列
numbers = [5,2,9,7]
numbers.sort(cmp = lambda x,y: x-y)
print numbers

>>>
[2,5,7,9]

#降序排列
numbers = [5,2,9,7]
numbers.sort(cmp = lambda x,y: y-x)
print numbers

在python3里的用法:https://www.cnblogs.com/test123/p/9851648.html

在python3中,sort是对于列表类型的排序函数,函数原型为:L.sort(key=None, reverse=False),该方法没有返回值,是对列表的就地排序。

  •key-- 是指用来比较的关键字,可以说是列表元素的一个权值。key一般用来接受一个函数(或者匿名函数),这个函数只接受一个元素,并返回其权值

    •reverse-- 是否逆序排列

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

= ['Google''Runoob''Taobao''Facebook']

 

a.sort() # 默认根据第一个字母排序

print(a)

 

a.sort(key= lambda x : x[1]) # 根据第二个字母排序

print(a)

 

def takeSecond(x):

    return x[1]

a.sort(key=takeSecond)

print(a)

 

输出:['Facebook''Google''Runoob''Taobao']

        ['Facebook''Taobao''Google''Runoob']

        ['Facebook''Taobao''Google''Runoob']    


题目描述

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

# -*- coding:utf-8 -*-
class Solution:
    def reOrderArray(self, array):
        # write code here
        list1=[]
        list2=[]
        for i in range(len(array)):
            if array[i]%2==1:
                list1.append(array[i])
            else:
                list2.append(array[i])
        list1.extend(list2)
        return list1

思路比较简单,知识点主要记录下list合并知识:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值