68道算法面试题必知必会

匿名网友 匿名网友 发布于: 2016-06-06 00:00:00
阅读 268 收藏 0 点赞 0 评论 0

【应该背过的东西】:ASCII码表中:‘A’~‘Z’的值对应 65~90 ; ‘a’~‘z’ 的ASCII值为 97~122;因此大小写之间差 32 。 91~96 分别代表:[ \ ] ^ _ `(~号下面)。数字 0 为 48;

 

1、十进制数据按照二进制形式输出 1.c

 

2、十进制按照十六进制输出 2.c / 2a.c

 

3、统计一个自然数的二进制表示形式中有多少个1 3.c / 3a.c

 

4、编写程序,输入4个整数找出最大值和最小值。 4.c Enter four integers: 10 8 49 35

Largest:49 Smallest:8

 

5、利用switch语句编写一个程序,把用数字表示的成绩转化为字母表示的等级。 5.c Enter numerical grade:84 Letter grade:B

 

6、编写程序实现整数的加减乘除四则运算(使用switch/case结构) 6.c

 

7、编写程序,确定一个数的位数: 7.c Enter a number:374 The number 347 has 3 digits

 

8、判断1-100的数中,共有多少个9 8.c

 

9、编写程序,找出用户输入的一串数中的最大值,程序需要提示用户一个一个地输入数值,当用户输入0或负数时,程序显示已输入的最大非负数。 9.c

 

Enter a number:60

Enter a number:38

Enter a number:100

Enter a number:75

Enter a number:0

The largest number entered was 100.

10、将1-200之间不能被3整除的数输出(要求每行输出10个数字) 10.c / 10a.c

 

11、打印如下半个菱形; 11b.c可以打印整个菱形。 11.c / 11a.c / 11b.c / 11d.c

 

*

***

*****

*******

*****

***

*

12、求1-100的素数(也叫质数)。 12.c

 

【总结】:规定:1不是素数,2是最小的素数。

13、寻找一维数组中最大、小值及其坐标位置并打印输出。 13.c / 13a.c

 

14、编写程序实现以下功能,在字符串str中找出最大的字符并放在第一个位置上,并将该字符前的原字符往后顺序移动。 14.c 如str字符串内容为“chyab”,程序执行完毕,str中的内容将成为“ychab”

 

【总结】:首先循环字符数组找出最大字母,并记录该字母下标。另用一个循环,将最大字母以前的字符串顺序向后移动(以后的字符串,不管它)str[i+1] = str[i],最后将str[0]赋值为最大字母即可。

15、将二维数组转置。(行变列、列变行) 15.c / 15a.c

 

num[5][5] = {

{1,6,2,3,7},

{2,7,3,2,2},

{3,2,5,2,6},

{3,2,6,4,2},

{4,3,7,4,8}};

 

【总结】:首先,进行转换的数组必须行列数相等。使用2重循环,三杯水方法,关键是交换的时候,循环初始条件:行循环初始i = 0;但是列循环初始j = i+1;

    可以画图理解出:交换的过程是以00 11 22 33 44 ……为对角线交换的,这几个值不会变。

16、给定某年某月某日,将其转换成这一年的第几天并输出 16.c / 16a.c

 

【总结】:这个用switch也能做,不过使用二维数组更为简单。判断闰年的方法:能被400整除,或者能被4但不能被100整除的年份:if(!(year % 100)&&(year % 4) || (year % 400)) 

    将12个月列到2维数组中,一行显示非闰年,一行显示闰年。天数sum = day再 += 各月之和。%4d 表示4位的年, %02d表示2位的月 %02d 表示2位的day

17、编写程序检查某一个整数中是否有重复的数字,如检查2822中存在重复数字2 17.c /17a.c

 

18、改写上题,使其可以显示出哪些数字有重复。 18.c

 

Enter a number: 939577

Repeated digit(s) : 7 9

 

【总结】:因为数字都是由0~9组成,所以可以初始化  int num[10]={0};  来分别代表这个十个数的位置。得到这个数,%10得到个位的数字,得到的数字是几,就将 num[几]++;

    然后/=10,再%10得到的是十位数,同样,得到几就将num[几]++;然后/=10,再%10……直到/=10 为0,while循环跳出。

    这时,数组里,第几位上的数,就表示数字几,出现了多少次。仍为0的表示一次也没出现过。

19、改写上题,使其打印一个列表,显示出每个数字在数中出现的次数:Enter a number: 19.c Digit : 0 1 2 3 4 5 6 7 8 9 Occurrences: 1 2 2 0 4 0 0 1 0 1

 

【总结】:把上面的用两个循环分别输出。

20、统计一下某字符串中某指定字符出现的次数(字符串和字符都从键盘输入) 20.c

 

【总结】:定义一个字符数组,定义一个字符,循环==即可。

20a、实现数组元素(字符串、数字)的反向输出。 20a.c / 20aa.c

 

【总结】:正着存,倒着取。

21、使用数组实现对栈的操作。 21.c

 

【总结】:

22、使用指针操作数组 22.c 1)、对int num[10]数组进行赋值 2)、求数组元素之和

 

【总结】: 1)num是一个“地址”,因此 num+10 是10个连续的地址。所以for的条件可以这样写:(p = num; p < num + 10; p++)

     2) 和1)同,不过上面是赋值,这里是取值。

23、定义char str[2][20],从键盘输入两个字符串保存在此数组中,求这两个字符串中的最大字符 23.c

 

【总结】:定义一个char max = str[0][0]; 使用2重循环,第一重 i < 2; 第二重 str[i][j] != ‘\0’; if(max < str[i][j]){max = str[i][jj]}

24、使用命令行参数接收运算符和运算值,实现四则运算。 24.c / 24a.c

 

【总结】:int main(int argc, char *argv[]) :argc 表示 输入的总参数个数,argv[i]表示输入的参数内容。如:编译通过后输入:./24a a + b 

    这里:*argv[0] = ./24a(因为argv[0]是 char* 型指针);  *argv[1] = a;*argv[2] = ‘+’;*argv[3] = b; 

    另,switch()的条件为 *argv[2] ,而 atoi()函数 参数则输入 arg[],因为该参数的类型是 char* 的,所以和 switch 不同;

25、实现itoa:char *myitoa(int n, char *p) 25.c

 

【总结】:重点是如果出现负数的情况。首先判断若这个数是负数,要 n = -n;将p[i++] = ‘-’;把首地址存成负号。然后 % 10 得到各个位上的数存入数组,最后存如‘\0’,

    拿-7926483为例,在内存中,存放的顺序依次为:‘-’|‘3’|‘8’|‘4’|‘6’|‘2’|‘9’|‘7’|‘\0’ 所以,输出时,下标0和*(最后一位)不用动,

    重要一次将3~7、8~9、2~4调换位置即可。使用for(–i;j<=i;i–,j++)这里i已经在之前存每个字符的时候增到8,j根据输入数是否为负数来进行判断,

    如果为负数那从1开始计,如果不为负数从0开始计。tmp = p[j];p[j] = p[i];p[i] = tmp;

26、 用循环结构将一个字符数组里的值复制到另外一个字符数组里(main函数里实现)。

 

                            26.c / 26a.c / 26_1.c / 26_2.c /26_2a.c / 26_3.c

1)、练习使用strcpy函数 2)、将上题设计思想整理成my_strcpy函数,并在main函数里调用、测试。 3)、部分复制,例如从第3个字符开始复制

 

【总结】:1)该函数的返回值是 char* 类型的,因此dest代表一个数组,对应%s,而使用在scanf中的时候不需要使用&符!!!

    2)for(i = 0;(dest[i] = str[i]); i++)这里学习for循环的第二个参数的用法,另外:\”写在printf中可以将“”打出在控制台上。\起转义的作用

    3)dest数组的起始字符应该是,要截取的字符串的第N个字符,循环截取,结束后要在末尾添加‘\0’

28、编写一个函数int is_leap_year(int year)判断参数year是不是闰年,如果year是闰年则返回1,否则返回0. 28.c

 

如果某年份能被4整除,但不能被100整除,那么这一年是闰年,此外,能被400整除的年份也是闰年。

29、编写一个函数double myround(double x),输入一个小数,将它四舍五入。 29.c 例如myround(-3.51)的值是-4.0,myround(4.49)的值是4.0。可以调用math.h中的库函数ceil和floor实现这个函数。

 

【总结】:重点: 光使用 #include <math.h> 是不行的,在编译的时候必须加 gcc -lm 这个命令才可以。否则无法正确引入这两个函数!!!

      %f代表“浮点型”,包括double float longdouble longfloat 都用这个表示。

     ceil(“天花板”)函数,取大于等于参数 x 的最小整数值,结果以double类型返回。 ceil(3.1415) –> 4.000000

     floor(“地板”)函数,取小于等于参数 x 的最小整数值,结果以double类型返回。 floor(3.1415) –> 3.000000

30、求解1+2+…+n的和 30.c / 30a.c 递归方法

 

【总结】:i = 1; i <= n; i++

31、输入正方形的个数和正方形边的长度 求总面积

 

scanf(“%d”,&n),n

就是当输入一个整形,且这个整形 的数不是0时,条件成立,否则,若输入0,则跳过while里面的内容

32、输入要罚抄的课文,和抄写遍数,来抄写课文

 

33、求连续数的立方和 33.cpp 33a.cpp

 

34、题目描述: NowCoder小时候走路喜欢蹦蹦跳跳,他最喜欢在楼梯上跳来跳去。 但年幼的他一次只能走上一阶或者一下子蹦上两阶。 现在一共有N阶台阶,请你计算一下NowCoder从第0阶到第N阶共有几种走法。[提示:利用斐波那契数组]34.cpp

 

输入描述:

输入包括多组数据。每组数据包括一个整数n, (1≤n≤90)。

 

输出描述:

对应每个输入包括一个输出。

为redraiment到达第n阶不同走法的数量。

 

 

输入例子:

1

2

 

 

输出例子:

1

2

35、二分查找法

 

36、一只成熟的兔子每天能产下一胎兔子。每只小兔子的成熟期是一天。 某人领养了一只小兔子,请问第N天以后,他将会得到多少只兔子。

 

37、蒜头的数学实在是太差了,于是老师把他关到小黑屋让他闭门修炼。老师跟他一张纸,上面一排写着1, 2, 3…N这N个数,中间用空白分隔。老师让他在空白处填上加号或者减号。他让蒜头君求出一共有多少种加运算符的方法使得整个表达式的值为0,并输出所有的方案。比如N=7时,1 2 3 4 5 6 7排成一排,一种插入符号的方案为1+2-3+4-5-6+7=0。是不是很有趣,快来帮蒜头君解出这题吧(*´▽`)ノノ

 

输入为一行,包含一个整数N(3≤N≤9)。

 

输出为所有在每对数字间插入“+”或“-”后能得到和为零的数列,并按照字典(ASCII码)序排列。如果无解就输出一行None。

 

不知道字典序和ASCII也不要紧,我们看样例输出就清楚啦,1到N排成一排,先每个位置优先放”+”,再放”-“,这么放的原因是因为”+”的ASCII码要比”-“小。

38、读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

 

39、输入一段数字,逆向输出

 

40、有N台灯,第一个人开了所有灯,第二个人关了2的倍数的灯,第三个人开了3的倍数的灯。这样下去求房间里最后还开着的灯。

 

41、蛇形填数

 

输入 4

输出:

10 11 12 1

9  16 13 2

8  15 14 3

7  6  5  4

42、利用递归求阶层

 

43、输出不能被3整除的数字

 

44、对数组先进行选择排序,然后进行二分查找

 

45、递归求解汉诺塔问题

 

46、卡片游戏

 

桌上有一叠牌,从第一张牌(即位于顶面的牌)开始从上往下依次编号为1~n。当至少还剩两张牌时进行以下操作:把第一张牌扔掉,然后把新的第一张放到整叠牌的最后。输入n,输出每次扔掉的牌,以及最后剩下的牌。

样例输入:7

样例输出:1 3 5 7 4 2 6

47、6174问题

 

任取一个四位数,只要四个数字不全相同,按数字递减顺序排列,构成最大数作为被减数;按数字递增顺序排列,构成最小数作为减数,其差就会得6174;如不是6174,则按上述方法再作减法,至多不过7步就必然得到6174. 

48、很多学生学习加法时,进位很容易出错。你的任务是计算两个整数在相加的时候需要进位多少次。

 

    样例输入:

    123 456

    555 555

    123 594

    0   0

    样例输出:

    0

    3

    1

49、周期串

 

如果一个字符串可以由某个长度为K的字符串重复多次得到,我们说该串以K为周期。例如,abcabcabc以3位周期(注意,也可以6和12为周期)。输入一个长度不超过80的串,输出它的最小周期。

样例输入:HoHOHO

样例输出:2

50、Tex括号

 

在Tex中,左右双引号是“和”,输入一篇包含双引号的文章,你的任务是把它转换成Tex的格式。

样例输入:“To be or not to be,”quoth the Bard,“that is the question”.

样例输出:”To be or not to be,”quoth the Bard,”that is the question”.

51.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

 

1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后,再去掉不满足条件的排列。

52.输入一个字符串,删除其中所有的数字,所有大写字母改成小写,其他不变,并输出

 

输入描述 

一个字符串,保证没有空格,以回车符结束,字符串长度<=20 

输出描述 

一个字符串,为题目要求的结果 

 

输入样例 

aAbB13A 

输出样例 

aabba 

 

解题思路:模拟题目要求即可,遇到数字就跳过不输出,遇到大写字母就改成小写。   

53.输入一个字符串,统计其出现频率最高的字符,并输出。若存在两个字符出现频率相同,则输出字典序较小的那一个

 

输入描述 

一个字符串,保证没有空格,以回车符结束,字符串长度<=20 

输出描述 

一个字符 

输入样例 

aabbaabb 

输出样例 

解题思路:做一个频率数组来统计所有字符的出现频率,机试时候不会有汉字输入,因此只考虑输入是ASCII编码的情况。  

54.输入10个数字,按各个位上的和从小到大排序,如果相同,则按数字从小到大排序。

 

输入描述 

10个正整数,保证都在int范围内,用空格隔开 

输出描述 

10个数字,其从大到小的值,用空格隔开,最后一个数字后不加空格 

 

输入样例 

11 3 2 4 5 9 8 7 10 6 

输出样例 

10 2 11 3 4 5 6 7 8 9 

 

解题思路:调用C++自带的sort函数,重新改写compare函数即可。 

55.你有一个容量为100的箩筐,给你30个物品,每个物品的体积已知问:最多能装多少个物品进箩筐

 

输入描述 

一行30个正整数,用空格隔开,表示每个物品的体积 

输出描述 

一个数字,为最多能装下的物品数 

 

输入样例(此处用3个物品作为样例,实际读入为30个) 

5 59 100 

输出样例 

 

解题思路:利用性价比对所有物品进行排序,优先装性价比高的,在此题中,性价比就是物品的体积   

56.10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下: (1) 及格线是10的倍数; (2) 保证至少有60%的学生及格; (3) 如果所有的学生都高于60分,则及格线为60分 (4) 及格线越高越好,但最高不能超过60

输入:输入10个整数,取值0~100 输出:输出及格线,10的倍数 输入样例:61 51 49 30 20 10 70 80 90 99 输出样例:50

解题思路:从高到低枚举及格线,输出第一个满足要求的及格线就是答案

 

57.输出 9*9 口诀

 

58、古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

 

程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21….

59、判断101-200之间有多少个素数,并输出所有素数。

 

判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 

60、将一个正整数分解质因数。例如:输入90,打印出90=233*5。

 

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: 
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

61、题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

 

程序分析:利用辗除法。

62、求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制

 

63、题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。

 

64.随机输入一个数,判断它是不是对称数(回文数)(如3,121,12321,45254)。不能用字符串库函数,判断一个字符串是不是回文串

 

65.写一个程序, 要求功能:求出用1,2,5这三个数不同个数组合的和为100的组合个数。

 

事实上,这个题目是一道明显的数学问题,而不是单纯的编程问题。我的解法如下:

因为x+2y+5z=100

所以x+2y=100-5z,且z<=20 x<=100 y<=50

所以(x+2y)<=100,且(x+5z)是偶数

66.输入一句英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,句子中单词以空格符隔开。

 

为简单起见,标点符号和普通字母一样处理。

例如:输入“I am a boy.”,则输出“boy. a am I”。

67.给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg,字符串内的其他字符不改变,给定函数,编写函数void Stringchang(const charinpu,charoutput)其中input是输入字符串,output是输出字符串

 

68.求两个字符串的乘积,结果存到字符串中,例如字符串一中存的“657891”,字符串二中存的“521”,分别将字符串中的字符转换成整型数字,进行计算后,再转换成字符类型存储起来 函数为 void mul(char *input1,int n,char *input2, int m,char *output) 其中input1和input2是输入,n是input1的长度,n2是input2的长度。Output是输出

评论列表
文章目录