常见算法

1. 组合数字

num = input("please input a number:")
count = 0
for i in range(1, num):
    for j in range(1, num):
        for k in range(1, num):
            if i != j and i != k and j != k:
                print(i * 100 + j * 10 + k)
                count += 1

print(count)

2. 冒泡排序

  • 简介:最基础的排序
  • 原理. 过程跟踪
  1. 内部:相邻元素两两比较 数次比较循环, 最大的元素放到了最后
  2. 外部:数次冒泡排序后,最终形成了一个从小到大的排序

步骤: **元素比较 (内部的比较循环) (外部的冒泡循环) ** **异常情况 **

"""
1、元素比较---比较循环---外部的冒泡循环---异常情况
2、写法:
外部循环冒泡
    内部比较循环
        元素比较
    异常情况处理
"""
def maopao(alist):
    n = len(alist)

    # 外部的冒泡排序循环
    for j in range(n - 1, 0, -1):
        count = 0
        # 内部的元素比较循环
        for i in range(j):
            # 元素的替换
            if alist[i] > alist[i + 1]:
                alist[i], alist[i + 1] = alist[i + 1], alist[i]
                count += 1

        # 异常情况
        if count == 0:
            break


if __name__ == '__main__':
    alist = [3, 44, 56, 78, 4, 6, 90]
    maopao(alist)
    print(alist)

  • 思路:

1、流程:元素比较-----比较循环——外部的冒泡循环----异常情况

2、写法:外部冒泡循环

​ 内部比较循环

​ 元素比较

​ 异常情况处理

  • 成本分析

最优:O(n)

最坏:O(n*n)

稳定性:稳定

3. 选择排序

  • 简介:简单直观的排序算法
  • 原理
  1. 无序队列选择最小的元素,最小元素和无序第一个元素替换
  2. 无序队列重复执行1
  • 步骤:
  1. 元素比较 选最小
  2. 最小元素和第一元素替换
  3. 外部的挑选循环
"""
1、流程:比较循环(选最小)---元素替换---外部选择循环
2、写法:
外部的选择循环
    内部的比较循环(选最小)
        比较条件
    元素替换

'每次选择循环的时候,无序列表的首个元素的下标一直在变动'
"""
def xuanze(alist):
    n = len(alist)
    # 外部的选择循环
    for j in range(n - 1):

        min_index = j
        # 比较循环后,选择最小的
        for i in range(min_index + 1, n):
            # 元素比较
            if alist[i] < alist[min_index]:
                min_index = i

        # 元素替换
        if min_index != j:
            alist[min_index], alist[j] = alist[j], alist[min_index]


if __name__ == '__main__':
    alist = [3, 44, 56, 78, 4, 6, 90]
    xuanze(alist)
    print(alist)
  • 思路:

1、流程:比较循环(选最小)----元素替换——外部选择循环

2、写法:

​ 外部的选择循环

​ 内部的比较循环(选最小)

​ 比较条件

​ 元素替换
关键点:每次选择循环的时候,无序列表的首个元素的下标一直在变动。

  • 成本分析:

最优:O(n*n)

最坏:O(n*n)

稳定性:不稳定

4. 插入排序

  • 简介:先定义一个有序队列,然后把无序队列中的第一个元素放到有序队列的 合适位置,重复操作,直至形成一个完整的有序队列 。打扑克
  • 原理:
  1. 无序队列选择第一个元素放到有序队列的末尾
  2. 有序队列里面进行冒泡排序 (往前冒泡)
  3. 重复前面两个步骤
  • 步骤

有序队列(外部):

​ 元素替换

​ 冒泡循环

插入排序循环(内部):

​ 无序队列元素向有序队列放

"""
1、流程:元素替换---冒泡排序---外部的插入排序循环
2、写法:
外部的插入排序循环
    有序列队的冒泡排序
        有序列队的元素比较
"""

def charu(alist):
    n = len(alist)

    # 外部的插入排序循环
    for i in range(n):

        # 假设无序列表的第一个位置元素的下标值是 i
        for j in range(i, 0, -1):

            # 有序列表内部元素比较
            if alist[j] < alist[j - 1]:
                alist[j], alist[j - 1] = alist[j - 1], alist[j]

            else:
                break


if __name__ == '__main__':
    alist = [3, 44, 56, 78, 4, 6, 90]
    charu(alist)
    print(alist)
  • 思路:

1、流程:元素替换----冒泡排序——外部的插入排序循环

2、写法:

​ 外部的插入排序循环

​ 有序队列的冒泡排序

​ 有序队列的元素比较

  • 成本分析

最优:O(n)

最坏:O(n*n)
稳定性:稳定

5. 快速排序

  • 简介:划分交换排序,1.从无序列表中挑选出一个元素,把无序列表分割成独立的两个部分,2.其中一部分的所有数据都比另外一部分的所有数据都要小,3.然后在按照此方法对这两部分数据进行快速排序,4.这个排序过程是递归进行
  • 原理

一、挑元素、划分组、分组重复前两步

​ 1、在无序列表中挑选一个随机的数字,作为当前列表的中间值

​ 2、移动左右标签,将比中间值大的放在右侧,比中间值小的放在左侧

​ 3、当两个标签重合的时候,中间值归位

二、特点: 一句话:左手右手一个慢动作,右手左手慢动作重播
1、因为是无序队列,所以位置可以随机挑

2、临时划分一个空间,存放我们挑选出来的中间元素

3、左标签位置空,移动右标签,反之一样

4、重复3,直到左右侧标签指向同一个位置,

5、把临时存放的中间元素,归位

"""
1.原理:挑元素、换分组、分组重复前两步
2.
换分组:准备工作 + 左右移动 + 元素归位
递归: 函数自调用 + 退出条件
"""
def quick_sort(alist, start, end):
    # 定义递归的条件
    if start < end:
        # 定义三个标签
        mid = alist[start]
        left = start
        right = end

        # 定义拆分的条件
        while left < right:
            # 右推进(右边的值大于等于中间值)
            while left < right and alist[right] >= mid:
                right -= 1

            alist[left] = alist[right]

            # 左推进(左边的值小于中间值)
            while left < right and alist[left] < mid:
                left += 1

            alist[right] = alist[left]

        # 获取中间值
        alist[left] = mid

        # 1.对切割后的左边的小组进行快速排序
        quick_sort(alist, start, left - 1)

        # 2.对切割后右边的小组进行快速排序
        quick_sort(alist, left + 1, end)


if __name__ == "__main__":
    li = [54, 26, 93, 17, 77, 31, 44, 77, 20]
    print(li)
    quick_sort(li, 0, len(li) - 1)
    print(li)

3. 列表去重

list = [1, 1, 2, 2, 3, 4, 5, 5]
new_list = set(list)
print(new_list)


def dislist(list):
    new_list = []
    if not list:
        return
    else:
        for i in list:
            if i not in new_list:
                new_list.append(i)
            else:
                continue

    return new_list


print(dislist(list))

# 以3为单位分组
print([[x for x in range(1, 100)][i:i + 3] for i in range(0, 100, 3)])

# 多个列表去重
a = [1, 2, 3, 4, 5]
b = [1, 2, 3]
print(set(a) & set(b))  # 取相同值,后的集合
print(set(a) ^ set(b))  # 取不同值,后的集合
# 字符串反转
string = 'hello world'

print(string[::-1])

4. 回文数

a = (input("请输入一个数字:"))
x = str(a)

x = x[::-1]
if x == a:
    print("True")

else:
    print("False")

5. 完数

"""
题目:求指定区域内的完数(10000为例),及所有因子之和恰好等于本身,如:6=1+2+3
1 将所有的因子追加到一个列表中
2 将符合条件的数字打出来
"""
l = []

for n in range(1, 1000):
    for a in range(1, n):
        if n % a == 0:
            l.append(a)
    if sum(l) == n:
        print(l)
        print(n)
    l = []

6.快速排序

def quick_sort(alist, first, last):
    if first <= last:
        split_point = find_pos(alist, first, last)
        quick_sort(alist, first, split_point - 1)
        quick_sort(alist, split_point + 1, last)


def find_pos(lists, low, high):
    key = lists[low]

    while low < high:
        while low < high and lists[high] >= key:
            high -= 1

        lists[low] = lists[high]
        while low < high and lists[low] <= key:
            low += 1

        lists[high] = lists[low]

    lists[low] = key
    return low


alist = [54, 67, 98, 41, 34, 12, 34, 54, 64, 756]
quick_sort(alist, 0, 9)
print(alist)

7. 斐波那契数列

# 一、使用函数定义
def finbo(num):
    numlist = [0, 1]
    for i in range(num - 2):
        numlist.append(numlist[-2] + numlist[-1])

    return numlist


print(finbo(10))


# 二、自定义迭代器对象
class FeiBo(object):
    # 提供构造方法
    def __init__(self, num):
        self.num = num
        super(FeiBo, self).__init__()
        self.current_index = 0
        # 记录初始化的前两个值
        self.a = 0
        self.b = 1

    def __iter__(self):
        # 返回迭代对象
        return self

    def __next__(self):
        if self.current_index < self.num:
            result = self.a
            self.a, self.b = self.b, self.a + self.b
            # 下标加一
            self.current_index += 1
            return result
        else:
            raise StopIteration


# 创建迭代器对象
fib = FeiBo(10)

for value in fib:
    print(value)

8. 素数(质数)

# 1。 获取素数
import time

start = time.clock()
i = int(input('please enter  an integer:'))
# 创建一个空list

r = list()

# 添加元素2
r.append(2)

# 从3开始挨个筛选
for a in range(3, i):
    b = False

    # 用a除以小于a的质数b
    for b in r:
        if a % b == 0:
            b = False
            break
        else:
            b = True
    if b == True:
        r.append(a)
print(r)
t = (time.clock() - start)
print(t)

# 2。判断一个数字是否为素数
num = int(input('please a num:'))

if num % 2 == 0:
    print("不是素数!")
elif num == 1:
    print("不是素数!")
else:
    print("是一个素数!")

9. 计算字符串中出现最多的字符,并打印

# -*- coding: utf-8 -*-
str_ = 'ssdasdasefadd'
# 遍历所有的单词个数------运用浅拷贝、深拷贝
dict_char_tmp = {i: str_.count(i) for i in str_}
print("所有单词的个数:", dict_char_tmp)

dict_char = {}
for key, value in dict_char_tmp.items():
    if dict_char.get(value):
        # 如果有相同数量的value值,则key相同,添加到列表value中
        dict_char[value].append(key)
    else:
        dict_char[value] = [key]

print(dict_char)
# 使用Sorted函数给 字典key值 排序---转换为列表
# dict.items()返回的是列表对象////dict.iteritems()返回的是 iterator 对象
dict_char_sort = sorted(dict_char.items(), key=lambda item: item[0], reverse=True)
print(dict_char_sort)

char_l = dict_char_sort[0][1]

print(char_l)
char_l.sort()
print("出现次数最多的字母是:", char_l[0], "个数是:", dict_char_sort[0][0])

10.找出一个字符串中最长不重复的子串

def find_long_no_repeat_substr(one_str):
    """
    找出一个字符串中最长不重复的子串
    :param one_str:
    :return:
    """
    res_list = []
    length = len(one_str)
    for i in range(length):
        tmp = one_str[i]
        for j in range(i + 1, length):
            if one_str[j] not in tmp:
                tmp += one_str[j]

            else:
                break
        res_list.append(tmp)

    res_list.sort(lambda x, y: cmp(len(x), len(y)))
    return res_list[-1]


if __name__ == '__main__':
    one_str_list = ["1234", "asdfsfadgfdgahsftw", "34236547635132347"]
    for one_str in one_str_list:
        res = find_long_no_repeat_substr(one_str)
        print("{0}最长非重复字串为:{1}".format(one_str, res))

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 1.简单排序 2.冒泡排序 思想:让当前项和后一项比较,如果当前项大于后一项,两者交换位置 3.快速排序 思想:在...
    馋中解禅阅读 759评论 0 0
  • 判断是否是回文 数组去重 统计一个字符串出现最多的字母 引申为数组 排序算法 (冒泡,快速) 生成斐波那契数组的方...
    _proto_麻瓜一袁阅读 429评论 0 3
  • 一. 冒泡排序(BubbleSort) 基本思想:两个数比较大小,较大的数下沉,较小的数冒起来。过程:比较相邻的两...
    mouekz阅读 473评论 0 0
  • 本文由玉刚说写作平台提供写作赞助,版权归玉刚说所有。原作者:Jiantao版权声明:未经玉刚说许可,不得以任何形式...
    jiantaocd阅读 1,905评论 0 90
  • 住的小区是政府安置那些田地被征用的农户的,这里的每个家庭至少有两套房子,一般一套是自己住,另外一套出租,多出的那套...
    残剑阅读 1,004评论 4 10