以python3版本为例说明, int 类型在python中是动态长度的。因为python3中int类型是长整型,理论支持大的数字,但它的结构其实也很简单, 在 longintepr.h 中定义:
struct _longobject {
PyObject_VAR_HEAD
digit ob_digit[1]
}
这结构是什么意思呢,重点在于 ob_digit 它是一个数组指针。digit 可认为是 int的别名。python的整型存储机制是这样的。比方要表示一个很大的数:123456789 。而每个元素只能表示3位十进制数(为理解打的比方)。那么python就会这样存储:
ob_digit[0] = 789
ob_digit[1] = 456
ob_digit[2] = 123
低位存于低索引下。python中整型结构中的数组,每个元素存储 15 位的二进制数(不同位数操作系统有差异32位系统存15位,64位系统是30位)。
因此,sys.getsizeof(0) 数组元素为0。此时占用24字节(PyObject_VAR_HEAD 的大小)。 sys.getsizeof(456) 需使用一个元素,因此多了4个字节。
你的例子第一列全是 3,我给个例子吧:[321, 32, 3, 4],输出该是 321,32,3,4。
第一个数越大,则应该排在后面,毕竟 4XXX 是比 3XXX 大的。
setp 1: [0][1][2]3 2 1
3 2
3
4
排序第 0 列,越大的排越后。
ret = [?, ?, ?, 4]
setp 2: [0][1][2]
3 2 1
3 2
3 <3> <- 补位 3,因为 3 是同 3 组第一个元素。
排序第 1 列,越大的排越后。
ret = [?, ?, 3, 4]
setp 3: [0][1][2]
3 2 1
3 2 <3> <- 补位 3,因为 3 是同 3 组第一个元素。
排序第 2 列,越大的排越后。323 比 321 大,所以……
ret = [?, 32, 3, 4]
只剩一个,那个排第一:
ret = [321, 32, 3, 4]
以上就是基本思路了。综上可得:
1. 先按 [0] 列分组:
2. 组中每个数都补位到同样长度,然后再排序。
完整代码:
def joinmin(ls):groups = {}
for item in ls:
prefix = item
n = 0
while prefix > 10:
prefix //= 10
n += 1
groups.setdefault(prefix, []).append([item, n])
sorted_keys = list(sorted(groups))
ret = 0
for prefix in sorted_keys:
items = groups[prefix]
max_n = max([t[1] for t in items])
presort_items = []
for item, item_n in items:
padding = item
n = item_n
while max_n > n:
padding *= 10
padding += prefix
n += 1
presort_items.append((padding, item, item_n))
for _, item, n in sorted(presort_items):
while n > -1:
ret *= 10
n -= 1
ret += item
return ret
不是看在你的分上答的,不过这种小题目蛮有趣的。
以下是一个使用 C 语言求解的方法,望采纳:#include <stdio.h>
int main() {
int a[10] = {3, 4, 2, 5, 7, 9, 1, 8, 6, 0}
int max_value = a[0]
int max_index = 0
for (int i = 1i <10i++) {
if (a[i] >max_value) {
max_value = a[i]
max_index = i
}
}
printf("The maximum value is %d, and it is at index %d.\n", max_value, max_index)
return 0
}
输出:
The maximum value is 9, and it is at index 5.
这段代码会初始化一个长度为 10 的整型数组 a,然后遍历数组中的所有元素,找到最大值并记录下标。