作者:Linux猿
简介:CSDN博客专家,华为云享专家,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
关注专栏:数据结构和算法成神路【精讲】 优质好文持续更新中……
目录
一、题目描述
二、解题思路
三、代码实现
3.1 代码
3.2 代码解读
四、复杂度分析
4.1 时间复杂度
4.2 空间复杂度
五、总结
有 1、2、3、4 四个数字,问:能够组成多少个互不相同且没有重复的三位数?并输出组合后满足要求的数字 ?
例如:满足要求的三位数有:123,234,431,432……等。
注意:1、2、3、4 都可以填在个位、十位和百位,但是不能重复。
我是华丽的分割线
因为只有三位,依次在每一位上尝试使用1、2、3、4,并排除个位、十位和百位有重复的情况,满足的情况输出。
具体到代码,可以使用「三层 for 循环」,这三层 for 循环分别枚举「百位」、「十位」和「个位」上的数字。
我是华丽的分割线
#include // 头文件
int main()
{
for(int i = 1; i < 5; ++i) { // 枚举百位的数字
for(int j = 1; j < 5; ++j) { // 枚举十位的数字
for(int k = 1; k < 5; ++k) { // 枚举个位的数字
if(i != j && j != k && i != k) { // 排除重复的情况
printf("%d %d %d\n", i, j, k);
}
}
}
}
return 0;
}
首先,第一行是「头文件」,int,printf 等的定义都在头文件「#include
「main 函数」中主要包含三层 for 循环,分别对应枚举「百位」、「十位」和「个位」的数,三个变量 i、j、k 分别是百位、十位和个位上的数字。
「if 语句」用于排除重复的情况,分别比较百位和十位、十位和个位、百位和个位是否相等,都「没有重复」的情况下才进入 if 语句,使用 printf 函数输出结果。
我是华丽的分割线
时间复杂度:O(n^3),这个 n = 4 为 for 循环的循环次数,因为有三层 for 循环,且 for 循环都是嵌套的,所以时间复杂度为 O(n^3)。
空间复杂度:O(1),在上述算法中,仅仅使用到了三个遍历 i,j,k,可以忽略不计,所以空间复杂度为 O(1)。
我是华丽的分割线
好了,本文就讲解到这个啦!主要考查对 for 循环以及 if 语句的应用,相信小伙伴看完后会加深对 for 循环的理解。
感觉有帮助记得「一键三连」支持下哦!有问题可在评论区留言,感谢大家的一路支持!猿哥将持续输出「优质文章」回馈大家!