09 2013 档案

摘要:首先是一个非常简单的题目,如何将一个数字反过来,比如12345反转成54321;可以选择将数字转换成字符串然后进行首尾换位操作,但更经典的作法应该是依次从原数字尾部取数,加到结果的高位;深入思考一下,如何将数字按二进制表示进行反转呢,比如6变成3(110变成011)?如何以两位为单位进行反转呢,比如12345变成45231?事实上,经典的数字反转算法中可以抽出两个概念,一个是这个数字的进制,另一个是进行反转时要求以多少位为一个整体;抽出这些之后,整个算法不需要改变:# -*- coding: utf-8 -*-import sys# 以多少位为一个整体N = 1# 进制factor = 2# 阅读全文
posted @ 2013-09-23 13:16 ZisZ 阅读(1189) 评论(0) 推荐(1)
摘要:有一个正整数M(假设取10),构造如下的倒三角数列(因下一行每一个数字都是上一行两个数据之和,因而我给它简单命名为沉淀三角,希望有人知道学名告诉我);第一行:1 2 3 4 5 ...... M-2 M-1 M第二行: 3 5 7 9 ...... 2M-3 2M-1第三行: 8 12 16 ...... 4M-4......第M行: ...在这个数列中求可整除奇数X(1除外)的数字的个数;好了,来解这道数学题:1. 首先,很容易看出,每一行是一个等差数列,差为2n-1;2. 然后,求解每行的首数,计算方法为:Firstn = ∑Cin-1*(i-1) = C0n-1 *1 + C1n-1*2 阅读全文
posted @ 2013-09-06 17:01 ZisZ 阅读(447) 评论(0) 推荐(0)
摘要:通过排序后,依次遍历前后两值求差即可,所以实质上的核心问题是排序;通过经典的比较排序算法复杂度在O(nlogn),而如果数据波动不大,则可通过桶排序将复杂度降到O(n);array = (5, 2, 4, 9, 0, 6)# quick sort# O(nlogn)def split(list, start, end): middle = list[end] index = start -1 for i in range(start, end+1): if list[i] max_e: max_e = i if i = 2:... 阅读全文
posted @ 2013-09-05 10:17 ZisZ 阅读(1686) 评论(0) 推荐(0)
摘要:求和值最大子段:不断对已有子段加值,当和值小于0时舍弃子段;由遍历决定复杂度O(n);求和值绝对值最小子段:求前n子段和值,然后求最小差值;求最小差值时使用了排序后遍历的方法,由排序决定复杂度O(nlogn);这里求最小差值的问题中,在某些限制条件下(数组波动不大)可以用桶排序进一步降低时间复杂度,见求最小差值,但因有条件限制不稳定,故不选取;# -*- coding: utf-8 -*-array = (4, -3, 2, 5, -9, 6)#array = (4, -3, 1)#array = (-4, -3, -2, -5, -9, -6) # 求解和值最大子段# 算法关键是将和值对整体 阅读全文
posted @ 2013-09-04 21:11 ZisZ 阅读(933) 评论(0) 推荐(0)