![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
经典算法编程题
杜尚峰
生活不止眼前的苟且,还有读不懂的诗和到不了的远方。
展开
-
跳台阶——斐波那契数列问题
[编程题]跳台阶一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解析:对于本题,前提只有 一次 1阶或者2阶的跳法。a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)c.由a\b假设可以得出总跳法为: f(n)原创 2016-09-13 19:31:57 · 1592 阅读 · 0 评论 -
数组中重复的数字
[编程题]数组中重复的数字在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。# -*- coding:utf-8 -*-class Solution: # 这里要特别原创 2016-09-13 20:26:10 · 177 阅读 · 0 评论 -
滑动窗口的最大值
[编程题]滑动窗口的最大值给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[原创 2016-09-13 20:30:44 · 489 阅读 · 0 评论 -
删除链表中重复的结点
删除链表中重复的结点在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5参考代码:# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val原创 2016-09-13 20:33:06 · 181 阅读 · 0 评论 -
链表中环的入口结点
链表中环的入口结点一个链表中包含环,请找出该链表的环的入口结点。参考代码1:# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def EntryNodeOfL原创 2016-09-13 20:35:58 · 253 阅读 · 0 评论 -
约瑟夫环——孩子们的游戏(圆圈中最后剩下的数)
孩子们的游戏(圆圈中最后剩下的数)每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-原创 2016-09-13 20:40:34 · 646 阅读 · 0 评论 -
把数组排成最小的数
把数组排成最小的数输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。参考代码:class Solution: def PrintMinNumber(self, numbers): # write code here if原创 2016-09-13 20:50:30 · 443 阅读 · 0 评论 -
复杂链表的复制
复杂链表的复制输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解析:对于复杂链表的复制,不易直接复制,应该在原链表每个元素后插入相同元素,并复制新链表特殊指针,然后拆分原链表和复制的链表# -*- coding原创 2016-09-13 20:51:57 · 402 阅读 · 0 评论 -
魔法权值
魔法权值给出 n 个字符串,对于每个 n 个排列 p,按排列给出的顺序(p[0] , p[1] … p[n-1])依次连接这 n 个字符串都能得到一个长度为这些字符串长度之和的字符串。所以按照这个方法一共可以生成 n! 个字符串。一个字符串的权值等于把这个字符串循环左移 i 次后得到的字符串仍和原字符串全等的数量,i 的取值为 [1 , 字符串长度]。求这些字符串最后生成的 n! 个字符串原创 2016-09-13 20:58:04 · 771 阅读 · 0 评论 -
出专辑
你作为一名出道的歌手终于要出自己的第一份专辑了,你计划收录 n 首歌而且每首歌的长度都是 s 秒,每首歌必须完整地收录于一张 CD 当中。每张 CD 的容量长度都是 L 秒,而且你至少得保证同一张 CD 内相邻两首歌中间至少要隔 1 秒。为了辟邪,你决定任意一张 CD 内的歌数不能被 13 这个数字整除,那么请问你出这张专辑至少需要多少张 CD ?参考代码:# -*-原创 2016-09-13 21:02:37 · 511 阅读 · 0 评论 -
华为校招编程题01-扑克牌大小
[编程题]扑克牌大小扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):) 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如:4 4 4 4-原创 2016-09-14 21:23:27 · 1123 阅读 · 0 评论 -
华为校招编程题02-最高分是多少
题目描述老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩. 输入描述:输入包括多组测试数据。每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目。学生ID编号从1编到N。第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生原创 2016-09-14 22:12:38 · 593 阅读 · 0 评论 -
不用加减乘除做加法
[编程题]不用加减乘除做加法写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解析:我们可以用三步走的方式计算二进制值相加: 5-101,7-111 第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111。第二步:计算进位值,得到1010,相当于各位做与操作得到101,再向左移一位得到1010,(101&原创 2016-09-13 20:25:03 · 308 阅读 · 0 评论 -
扑克牌顺子
[编程题]扑克牌顺子LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,原创 2016-09-13 20:18:25 · 403 阅读 · 0 评论 -
变态跳台阶
[编程题]变态跳台阶一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解析:因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级跳1级,剩下n-1级,则剩下跳法是f(n-1)跳2级,剩下n-2级,则剩下跳法是f(n-2)所以f(n)=f(n-1)+f(n-2)+...+f(1)因为f(n-1)=f(原创 2016-09-13 19:37:39 · 301 阅读 · 0 评论 -
矩形覆盖——斐波那契数列
[编程题]矩形覆盖我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解析:依旧是斐波那契数列2*n的大矩形,和n个2*1的小矩形其中target*2为大矩阵的大小有以下几种情形:1⃣️target 2⃣️target = 1大矩形为2*1,只有一原创 2016-09-13 19:41:22 · 1285 阅读 · 0 评论 -
二维数组中的查找
[编程题]二维数组中的查找在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:首先我们选择从左下角开始搜寻,(为什么不从左上角开始搜寻,左上角向右和向下都是递增,那么对于一个点,对于向右和向下会产生一个岔路;如果我们选择从左下脚开始搜寻的话,如果大于就原创 2016-09-13 19:42:39 · 426 阅读 · 0 评论 -
二进制中1的个数
[编程题]二进制中1的个数输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。参考代码1:public class Solution { public int NumberOf1(int n) { int count = 0; while(n!= 0){ count++; n =原创 2016-09-13 19:48:05 · 195 阅读 · 0 评论 -
旋转数组的最小数字
[编程题]旋转数组的最小数字把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解析:分为1.数组为空2.部分旋转,例如原创 2016-09-13 19:52:13 · 234 阅读 · 0 评论 -
合并两个排序的链表
[编程题]合并两个排序的链表输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。参考代码:# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass原创 2016-09-13 19:57:45 · 180 阅读 · 0 评论 -
计算字符个数
[编程题]计算字符个数写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。遍历字符串,计数输入字符数即可#使用python代码很简洁,原字符串与替换后的字符串长度差即为含有的字符数s= raw_input()print len(s)-len(s.replace(raw_input(),''))原创 2016-09-13 20:02:22 · 314 阅读 · 0 评论 -
字符串的排列
[编程题]字符串的排列输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 参考代码:# -*- coding: utf-8 -*-"""Created on Tue Aug 23 11:51:47 2016 @author:原创 2016-09-13 20:06:17 · 199 阅读 · 0 评论 -
连续子数组的最大和
[编程题]连续子数组的最大和HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他原创 2016-09-13 20:08:43 · 266 阅读 · 0 评论 -
第一个只出现一次的字符
[编程题]第一个只出现一次的字符在一个字符串(1参考代码:def FindChar(pInputString): for x in pInputString: if pInputString.count(x) == 1: return x return '.' while 1: try: pr原创 2016-09-13 20:11:59 · 185 阅读 · 0 评论 -
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
[编程题]求1+2+3+...+n求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解题思路:需利用逻辑与的短路特性实现递归终止。 参考代码:# -*- coding: utf-8 -*-"""Created on Tue Aug 23 22:40:44 2016 @原创 2016-09-13 20:13:07 · 1072 阅读 · 0 评论 -
递归-将功赎过
题目描述小赛是一名幸运的程序员。虽然他成功帮助小朋友以最快时间夺回了狼堡,但是面试官却打算和他说拜拜了。理由是——游戏天赋太高,有不务正业、走火入魔的倾向QAQ……尽管小赛很不能接受这个理由,可是却只能心灰意冷地吃下这个结果。然而,在他即将走出门的时候,面试官给了幸运的小赛一个最后的机会。原来,面试官的手机被他调皮的儿子小明用一个数字作为密码原创 2016-09-19 21:53:44 · 1132 阅读 · 0 评论