本文介绍五个算法小题目:
- 四个不同数字组成互不相等且不重复的三位数。
- 斐波那契数列。
- 字符串转整型。
- 简单逻辑思考题。
- 数组移动
分享一下博客上看到的一些算法题:
四个数字组成三位数
有数字:1、2、3、4,请问能组成多少个互不相同且无重复数字的三位数?请输出这些数字。
解法
三位数,百位数有4种选择,则十位数有3种选择,从而个位数只有2种选择。共4x3x2=24种情况。
1 | int count = 0; |
如果要写能处理不同输入数字数量的,就得用递归:
1 | /// <summary> |
斐波那契数列
有一列数:1、1、2、3、5……求第30个数。
解法
第i个数等于第(i-1)个数+第(i-2)个数。使用递归。
1 | private int GetNum(int index) |
这里提一下我们在朋友圈经常看到的一个斐波那契数列应用:切割巧克力
某人把一个8x8的巧克力切成4块,却能拼成一个5x13的长方形==》64 = 65?!
其实这里就是利用了斐波那契数列的这个性质:5、8、13正是数列中相邻的三个项!每个奇数项的平方都比前后两项之积多1,每个偶数项的平方都比前后两项之积少1。加上另一个特性:前一项与后一项之比越来越接近黄金分割。
字符串转整型
将用户输入的字符串,不用系统api转化为整型。
解法
依靠ASCII,或者每个char与0的差值,判断是否为数字,是否10之内。
1 | private int GetNum(string str) |
逻辑思考题
A、B、C、D、E五个学生计划报名参加活动,请根据以下条件判断谁真正参加活动:
A参加,B也参加;
B和C只有一个人参加;
C和D或者都参加,或者都不参加;
D和E中至少有一个人参加;
如果E参加,那么A和D也参加。
解法
1,0为参加或者不参加;设置5个循环进行判断,将条件转化成对应的值判断进行循环。
1 | char[] name = { 'A', 'B', 'C', 'D', 'E' }; |
该逻辑思考题比较有趣,第一次看到这样和代码结合起来的逻辑题。
数组移动
这个得推荐去链接中的博客 仔细看,想法很新奇的。
这里简单拿一个来讲:
把数组元素前后部分交换 MoveFirstPartOfArrayToTheEnd(int[] array, int index) 比如 {1,2,3,4,5,6,7} 3 => {4,5,6,7,1,2,3}
解法
简单处理:把1-2-3排后面;然后从头开始把剩下的排进去。
1 | private void GetNum() |
上面的处理思想一般般,该题主要是了解链接中反转的用法:
分段1,2,3—4,5,6,7
分段反转3,2,1 — 7,6,5,4
整体反转4,5,6,7,1,2,3
1 | private void ReverseNums() |
git代码库: Codes