一:基础算法题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.解数独

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

空白格用 '.' 表示。

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

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

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

    现在,越来越多的公司面试以及考验面试对算法要求都提高了一个层次,从现在,我讲每日抽出时间进行5+1算法题讲解,5是指基础题,1是指1道中等偏难.希望能够让大家熟练掌握python的语法结构已经一些高级 ...

  2. python实现经典算法

    1,快速排序 题目形式:手写一下快速排序算法. 题目难度:中等. 出现概率:约50%.手写快排绝对是手撕代码面试题中的百兽之王,掌握了它就是送分题,没有掌握它就是送命题. 参考代码: def quic ...

  3. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...

  4. python 实现经典算法

    import time start_time = time.clock() list_ = [9, 2, 7, 4, 5, 6, 3, 8, 1] """ # 堆排序(通 ...

  5. Python 每日一练 | Flask 实现半成品留言板

    留言板Flask实现 引言 看了几天网上的代码,终于写出来一个半成品的Flask的留言板项目,为什么说是半成品呢?因为没能实现留言板那种及时评论刷新的效果,可能还是在重定向上有问题 或者渲染写的存在问 ...

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

    原文:经典算法题每日演练--第十七题 Dijkstra算法 或许在生活中,经常会碰到针对某一个问题,在众多的限制条件下,如何去寻找一个最优解?可能大家想到了很多诸如“线性规划”,“动态规划” 这些经典 ...

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

    原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0, ...

  8. 经典算法题每日演练——第十四题 Prim算法

    原文:经典算法题每日演练--第十四题 Prim算法 图论在数据结构中是非常有趣而复杂的,作为web码农的我,在实际开发中一直没有找到它的使用场景,不像树那样的频繁使用,不过还是准备 仔细的把图论全部过 ...

  9. 经典算法题每日演练——第十一题 Bitmap算法

    原文:经典算法题每日演练--第十一题 Bitmap算法 在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间,多么的简洁优美, 但是在特定的场 ...

随机推荐

  1. ubuntu 16.04下node和pm2安装

    一.安装node,这里安装9.0的版本,安装其它版本直接到https://deb.nodesource.com/setup_9.x找相应版本的更改既可 1.sudo apt-get remove no ...

  2. Jenkins连接Git仓库时候报错Permission denied, please try again.

    一.连接GIT仓库报错 Failed to connect to repository : Command : stdout: stderr: Permission denied, please tr ...

  3. jq序 选择器

    1.库和框架 库:小而精 直接操作DOM css() jquerry封装js的那些操作: 事件,属性, ajax(交互的技术),DOM,选择器 框架:大而全  事件,DOM,属性操作,ajax,&qu ...

  4. 如果使用jsp文件,需要在配置文件中配置resources项,才能让idea识别这个jsp文件

    没有添加这一项在编译后的.class文件中的结构目录是这样子的 添加上这一个配置项,在class配置文件中的位置是这样子的: 添加的配置文件是这样子的: <resources> <r ...

  5. Linux安装Gitlab服务器

    1. 下载GitLab 下载地址:https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.8.2-ce.0.el ...

  6. Python 包:

    分享一波油藏描述方面的Python开源包 前一阵去捷克参加了数学地质年会(IAMG2018),听完汇报,发现在数学地质领域用python的越来越多了,他们的很多成果都是用python做出来的.不管喜不 ...

  7. SQL-select常用语句

    1.全套装备 select [select选项] 字段列表[字段别名]/* from 数据源[where 条件子句] [group by条件子句] [having 子句] [order by 子句] ...

  8. Burst Balloons(leetcode戳气球,困难)从指数级时间复杂度到多项式级时间复杂度的超详细优化思路(回溯到分治到动态规划)

    这道题目做了两个晚上,发现解题思路的优化过程非常有代表性.文章详细说明了如何从回溯解法改造为分治解法,以及如何由分治解法过渡到动态规划解法.解法的用时从 超时 到 超过 95.6% 提交者,到超过 9 ...

  9. opera11以下添加搜索引擎的办法

    opera11以下:首选项,搜索引擎设置添加搜索引擎,地址是https://www.baidu.com/s?wd=%s 这是从其他浏览器里面得到的. opera11以上: http://www.bai ...

  10. [LeetCode] 75. Sort Colors 颜色排序

    Given an array with n objects colored red, white or blue, sort them in-place so that objects of the ...