python每日经典算法题5(基础题)+1(较难题)

一:基础算法题5道

1.阿姆斯特朗数

如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数。判断用户输入的数字是否为阿姆斯特朗数。

(1)题目分析:这里要先得到该数是多少位的,然后再把每一位的数字截取出来,把各位数字的n次方之和和该数一起判断即可。
(2)算法分析:python中有len()函数可以得到一个字符串的长度,因此需要先把一个正整数转化为正整数字符串。然后从高位向低位截取(也可以反过来)。或者高效算法利用for循环切片。

从高位到低位:用正整数除了10的n次方,得到的商就是高位的数,余数就是下次循环的数。

从低位到高位:用正整数除以10,得到的余数就是低位的数,商就是下次循环的数。

for循环:用for循环依次得到每一位数。就是可迭代对象依次显示。

(3)用到的python语法:while循环,for循环,if语句,函数。

(4)博主答题代码:

从高位到低位:

def judge(num):
    mysum = 0
    n = len(str(num)) - 1
    m = n + 1
    firstNum = num
    while num > 0:
        quotient = num //  (10**n)
        remainder = num % (10**n)
        mysum += quotient ** m
        num = remainder
        n -= 1
    if mysum == firstNum:
        print(‘该数是阿姆斯特朗数‘)
    else:
        print(‘该数不是阿姆斯特朗数‘)

num = int(input(‘请输入一个整数:‘))
judge(num)

从低位到高位:

def judge(num):
    mysum = 0
    n = len(str(num)) - 1
    m = n + 1
    firstNum = num
    while num > 0:
        quotient = num // 10
        remainder = num % 10
        mysum += remainder ** m
        num = quotient
        n -= 1
    if mysum == firstNum:
        print(‘该数是阿姆斯特朗数‘)
    else:
        print(‘该数不是阿姆斯特朗数‘)

num = int(input(‘请输入一个整数:‘))
judge(num)

(5)高效方法:

for循环:

def judge(num):
    n = len(num)
    sum = 0
    for i in num:
        sum += int(i) ** n
    if sum == int(num):
        print(‘该数是阿姆斯特朗数‘)
    else:
        print(‘该数不是阿姆斯特朗数‘)

num = input(‘请输入一个整数:‘)
judge(num)

2.整数数组

给定一个整数数组,判断是否存在重复元素。

(1)题目分析:利用list的内置函数count计算每一个元素的数量,时间会很多,内置函数list.count(i)时间复杂度为O(n) 外面嵌套一层循环,总的时间为O(n^2),不是一个高效算法。

可以排序后对相邻元素判断是否相等。还有一个方法是利用set()特性进行判断。

(2)算法分析:根据上面的题目分析用高效一点的算法展示。
(3)用到的python语法:
(4)博主答题代码:

def judgeInt(num):
    this_set = set(num)
    if len(this_set) == len(num):
        print(‘没有重复‘)
    else:
        print(‘有重复‘)

my_num = input(‘请输入一个整数:‘)
judgeInt(my_num)

3.回文数

判断一个整数是否是回文数。

(1)题目分析:回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

(2)算法分析:可以利用python的切片很方便地解决该问题,但是如果是其它语言的话,没有切片。因此需要考虑普遍的方法。

算法分析如下:

可以看到,我们根据两种不同情况分析,即可得结果。

(3)用到的python语法:if判断语句,切片,函数。
(4)博主答题代码:

def judge(x):
    this_str = str(x)
    if len(this_str) % 2 != 0:
        mid = int((len(this_str) + 1 ) / 2 - 1)
        left = mid - 1
        right = mid
        if this_str[0:left+1] == this_str[-1:right:-1]:
            return True
        else:
            return False

    if len(this_str) % 2 == 0:
        mid = int(len(this_str)/2) - 1
        if this_str[0:mid+1] == this_str[-1:mid:-1]:
            return True
        else:
            return False

num = input(‘请输入一个整数:‘)
if judge(num):
    print(‘{0}是回文数‘.format(num))
else:
    print(‘{0}不是回文数‘.format(num))

(5)高效方法:

def judge(x):
    return str(x) == str(x)[::-1]

num = input(‘请输入一个整数:‘)
if judge(num):
    print(‘{0}是回文数‘.format(num))
else:
    print(‘{0}不是回文数‘.format(num))

只需要一行代码即可以判断,这就是切片的好处。

是不是很简单呢。

4.回文数进阶算法,不限转化为字符串

那有没有什么不需要先转化为字符串的方法呢?也是有的。可以利用前面的阿姆斯特朗数从高位到低位和从低位到高位获取两个列表或者字典进行比较,这里就不分析了,直接上代码:

def judge(num1):
    if ‘-‘ in str(num1):
        return False
    if num1 >= 0 and num1 < 10 :
        return True
    list1 = [];list2 = []
    num2 = num1
    n1 = len(str(num1)) - 1
    n2 = len(str(num2)) - 1

    while num1 > 0:
        quotient1 = num1 //  (10**n1)
        remainder1 = num1 % (10**n1)
        list1.append(quotient1)
        num1 = remainder1
        n1 -= 1

    while num2 > 0:
        quotient2 = num2 // 10
        remainder2 = num2 % 10
        list2.append(remainder2)
        num2 = quotient2
        n2 -= 1
    num = 0
    for i in range(0,len(list1)):
        if list2[i] == list1[i]:
            num += 1
    if num == len(list1):
        return True
    else:
        return False

num = int(input(‘请输入一个整数:‘))
if judge(num):
    print(‘{0}是回文数‘.format(num))
else:
    print(‘{0}不是回文数‘.format(num))

效率确实很低。

5.插入排序

对于未排序数组,在已排序序列中从前向后或从后向前扫描,找到相应位置并插入。

(1)题目分析:这是个简单的算法,只需要把要每个元素依次和相邻的元素比较即可。

(2)算法分析:想用一个变量标记遍历到的元素,然后,有两种方法。

从后先前,把该元素和左边的元素进行对比,如果比左边的元素小,就互换,当左边的元素的编号为-1时停止。

从前先后,把该元素和右边的元素进行对比,如果比右边的元素大,就互换,当右边的元素的编号为数组的长度减1时停止。

(3)用到的python语法:while循环,函数,数据交换。

(4)博主答题代码:

def insert(arr):
    for i in range(1,len(arr)):
        j = i
        while j > 0:
            if arr[j] < arr[j-1]:
                arr[j-1],arr[j] = arr[j],arr[j-1]
            j -= 1        

my_arr = list(map(int,input(‘请输入数组:‘).split(‘,‘)))
insert(my_arr)
print(my_arr)

(5)高效代码

用python的列表排序函数sort()可以很方便进行排序。

二:较难算法题1道

这些等到下一篇博客会详细讲解。

1.串联所有单词的字串

给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。

注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。

2.解数独

编写一个程序,通过已填充的空格来解决数独问题。

空白格用 ‘.‘ 表示。

较难算法题等到之后博客会详细讲解。

原文地址:https://www.cnblogs.com/ITXiaoAng/p/11517982.html

时间: 2024-10-11 07:06:04

python每日经典算法题5(基础题)+1(较难题)的相关文章

python每日经典算法题5(基础题)+1(中难题)

现在,越来越多的公司面试以及考验面试对算法要求都提高了一个层次,从现在,我讲每日抽出时间进行5+1算法题讲解,5是指基础题,1是指1道中等偏难.希望能够让大家熟练掌握python的语法结构已经一些高级函数的应用.这些题目是在某些刷题的网站上登记的有水平的题目.这里如果有需要input的简单题,就略去了输出结果.如果时间充裕,则就会增加每日更多习题. 一:基础算法题10道 1.判断用户输入的年份是否为闰年 题目解析: (1)问题分析:能被4整除但不能被100整除的年份为普通闰年,能被400整除的年

算法和数据结构基础题集(持续更新中)

 注意一题多解,举一反三,从普通算法到最优算法 1.判断一个字符串中的字符是否唯一(即没有重复),不能使用额外的数据结构(使用基本的数据结构) 2.反转一个字符串 3.去掉字符串中的重复字符,不能使用额外的缓存空间 4.判断两个字符串是否是变位词(两个单词字符相同,但是位置不同的单词) 5.写一函数,把字符串的空格替换为%20 6.判断字符串是否是另一个字符串的字串 7.从一个未排序的链表去除重复的项,不允许使用临时的缓存 8.从一个单链表中返回倒数第k个元素 9.删除链表中的给定节点 10

python 实现经典算法

1 import time 2 start_time = time.clock() 3 4 list_ = [9, 2, 7, 4, 5, 6, 3, 8, 1] 5 6 7 """ 8 # 堆排序 9 # 最大堆调整:将堆的末端子节点调整,使得子节点永远小于父节点. 10 # 建立最大堆:将堆所有数据重新排序. 11 # 堆排序:移除位在第一个数据的根节点,并做最大堆调整的递归运算. 12 import random 13 14 15 def max_heapify(hea

经典算法题每日演练——第十三题 赫夫曼树

原文:经典算法题每日演练--第十三题 赫夫曼树 赫夫曼树又称最优二叉树,也就是带权路径最短的树,对于赫夫曼树,我想大家对它是非常的熟悉,也知道它的应用场景, 但是有没有自己亲手写过,这个我就不清楚了,不管以前写没写,这一篇我们来玩一把. 一:概念 赫夫曼树里面有几个概念,也是非常简单的,先来看下面的图: 1. 基础概念 <1>  节点的权: 节点中红色部分就是权,在实际应用中,我们用“字符”出现的次数作为权. <2>  路径长度:可以理解成该节点到根节点的层数,比如:“A”到根节点

经典算法题每日演练——第十六题 Kruskal算法

原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0,1,2,3,4,5}这样6个节点,我们知道Prim算法构建生成树是从”顶点”这个角度来思考的,然后采用“贪心思想” 来一步步扩大化,最后形成整体最优解,而Kruskal算法有点意思,它是站在”边“这个角度在思考的,首先我有两个集合. 1. 顶点集合(vertexs): 比如M集合中的每个元素都可以认

经典算法题每日演练——第三题 猴子吃桃

原文:经典算法题每日演练--第三题 猴子吃桃 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多 吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天摘了多少个桃子? 分析: 这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要 我们找到递推公式,问题就迎刃而解了. 令S10=1,容易看出 S9=2(S10+1), 简化一下 S9=2S10+2 S8=2S

经典算法题每日演练——第二十题 三元组

原文:经典算法题每日演练--第二十题 三元组 我们知道矩阵是一个非常强大的数据结构,在动态规划以及各种图论算法上都有广泛的应用,当然矩阵有着不足的地方就是空间和时间 复杂度都维持在N2上,比如1w个数字建立一个矩阵,在内存中会占用1w*1w=1亿的类型空间,这时就会遇到outofmemory...那么面 临的一个问题就是如何来压缩矩阵,当然压缩的方式有很多种,这里就介绍一个顺序表的压缩方式:三元组. 一:三元组 有时候我们的矩阵中只有零星的一些非零元素,其余的都是零元素,那么我们称之为稀疏矩阵,

经典算法题每日演练——第二十四题 梳排序

原文:经典算法题每日演练--第二十四题 梳排序 这篇再看看一个经典的排序,梳排序,为什么取名为梳,可能每个梳都有自己的gap吧,大梳子gap大一点,小梳子gap小一点. 上一篇我们看到鸡尾酒排序是在冒泡排序上做了一些优化,将单向的比较变成了双向,同样这里的梳排序也是在冒泡排序上做了一些优化. 冒泡排序上我们的选择是相邻的两个数做比较,就是他们的gap为1,其实梳排序提出了不同的观点,如果将这里的gap设置为一定的大小, 效率反而必gap=1要高效的多. 下面我们看看具体思想,梳排序有这样一个1.

经典算法题每日演练——第十七题 Dijkstra算法

原文:经典算法题每日演练--第十七题 Dijkstra算法 或许在生活中,经常会碰到针对某一个问题,在众多的限制条件下,如何去寻找一个最优解?可能大家想到了很多诸如“线性规划”,“动态规划” 这些经典策略,当然有的问题我们可以用贪心来寻求整体最优解,在图论中一个典型的贪心法求最优解的例子就莫过于“最短路径”的问题. 一:概序 从下图中我要寻找V0到V3的最短路径,你会发现通往他们的两点路径有很多:V0->V4->V3,V0->V1->V3,当然你会认为前者是你要找的最短 路径,那如