算法复习-a 到 z不完全排列生成
在网上看到这个题,觉得很有意思,也算是一种方法。。。但是复杂度同样很高,生成全排列本身需要很大复杂度。
题目:现在有 a 到 z 26 个元素, 编写程序打印 a 到 z 中任取 3 个元素的组合(比如 打印 a b c ,d y z等)
分析:
大家看看我这么做行不
char a, b, c;
for(a = 'a'; a<='z'; a++)
for(b= a+; b<='z'; b++)
for(c = b+; c<='z'; c++)
printf("%c%c%c\n", a, b, c);
问题1:不可能出现 bac等。因为每次我多加了 1 看看嵌套的 for 有什么不同,但是题目要求只求组合不管顺序。
问题2:如果你要这么做 ,面试官必然会问 ,如果我要求 4 个字母的组合呢?(一脸懵逼状=。=)
思路:
我设想 a - z 每个字母给一个标记 0 或 1 ,如果为 1 的时候表示这个字符在组合中 ,如果为 0 那么表示这个字符不在组合中。
这样子,我们需要 26 个标记位。
这个时候我们会发现 ,当所有变量都在组合中时, 那么就是 26 个 1;当一个变量都不在集组合中时,就是 26 个 0。
我们把 26 个 1 和 26 个 0 看成数字,那么就是 0 和 (1 << 26) - 1。
那么其它的组合,肯定是 0 到 (1 << 26) - 1 之间的数字,对吧
比如
cba 就是 …0000000111
dcba 就是 …00000000001111
所以说 我们做一个循环 从 0 开始 到(1 << 26) - 1
然后只取有 3 个 1 的数字
然后再看对应的 1 代表哪个字符就可以了
具体就要看程序了:
#include <stdio.h>
//某个数二进制位上有几个 1
int bit(unsigned int x)
{
int c = ;
while( x )
{
c++;
x = (x & (x - ));
}
return c;
} void print(unsigned int x, int count)
{
int i = ;
//控制,假如count为3, x 里边有三个 1
if( bit(x) == count )
{
for(i=; i<; i++)
{
if( x & )
{
printf("%c ", (char)('a' + i));
}
x = (x >> );
}
printf("\n");
}
}
int main()
{
const unsigned int N = ;
const unsigned int C = ;
const unsigned int X = ( << N) - ; //X=(1<<26)-1
unsigned int i = ; for(i=; i<X; i++)
{
print(i, C);
}
return ;
}
算法复习-a 到 z不完全排列生成的更多相关文章
- C#冒泡算法复习
C#冒泡算法复习 冒泡算法的意思:每一趟找到一个最小或最大的数放到最后面,比较总数的n-1次(因为比较是2个双双比较的) 第一层循环表示进行比较的次数,总共要比较(数的)-1次 (因为比较是2个双双比 ...
- 【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成
本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...
- HDU 1027 Ignatius and the Princess II 排列生成
解题报告:1-n这n个数,有n!中不同的排列,将这n!个数列按照字典序排序,输出第m个数列. 第一次TLE了,没注意到题目上的n和m的范围,n的范围是小于1000的,然后m的范围是小于10000的,很 ...
- ACM-挑战题之排列生成
题目描述:挑战题之排列生成 一自然数N,设N为3,则关于N的字典序排列为123,132,213,231,312,321.对于一个自然数N(1<= N <= 9 ) , 你要做的便是生成它的 ...
- 【CF1443E】Long Permutation 题解(排列生成模板)
原题链接 题意简介 给定一个长度为 n 的排列 {1,2,3,...,n} .现有两种操作: 对某个区间 [l,r] 求和 将排列往后推 x 次 (按字典序) 其中 \(n,q \leq 2\time ...
- 【转】常用算法复习及实现(C++版)
一.霍夫曼树实现 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大 ...
- 算法复习——差分约束(ssoi种树)
题目: 题目描述 为了绿化乡村,H 村积极响应号召,开始种树了. H 村里有 n 幢房屋,这些屋子的排列顺序很有特点,在一条直线上.于是方便起见,我们给它们标上 1-n .树就种在房子前面的空地上. ...
- 算法复习周------“动态规划之‘最长公共子序列’”&&《计蒜课》---最长公共子串题解
问题描述: 这个问题其实很容易理解.就是给你两个序列X={x1,x2,x3......xm} Y={y1,y2,y3......ym},要求找出X和Y的一个最长的公共子序列. 例:Xi={A, B, ...
- 18级北航软件学院算法复习--Samshui
A 比特手链 简单模拟 判断 贪心 叶姐要想哥赠送一串比特手链,这个手链由0和1组成.想哥买了手链B,无意间得知叶姐想要同样长度的手链A.想哥囊中羞涩,只能手工调整手链.他希望最少通过以下操作进行最少 ...
随机推荐
- 模仿抽奖转盘,并且用cookie记录历史次数
自己制作了一个模仿抽奖转盘的小游戏,代码比较简单,规则是只有三次抽奖机会,并且浏览器会记录抽奖的次数, 代码如下 <!DOCTYPE html> <html> <head ...
- 2D轮播图
目录结构 index.html <!DOCTYPE html><html lang="en"><head> <meta charset=& ...
- vmnet2访问外网
1.vmnet2用于内网之间的访问,外部网络访问不了它.它可以访问外网,要想访问外网就必须有真实主机共享网络给它 2.[root@localhost ~]# vim /etc/sysconfig/ne ...
- MSF魔鬼训练营第一章 初识Metasploit
1.1.4渗透测试过程环节 PTES标准7个阶段 1.前期交互阶段 收集客户需求.准备测试计划.定义测试范围与边界.定义业务目标.项目管理与规划等 2.情报搜集阶段 公开来源信息查 ...
- [转帖]虚拟内存探究 -- 第二篇:Python 字节
虚拟内存探究 -- 第二篇:Python 字节 http://blog.coderhuo.tech/2017/10/15/Virtual_Memory_python_bytes/ 是真看不懂哦 ...
- java学习笔记 - 线程池(一)
线程池(Thread Pool):把一个或多个线程通过统一的方式进行调度和重复使用的技术,避免了因为线程过多而带来使用上的开销 优点:(面试题)可重复使用已有线程,避免对象创建.消亡和过度切换的性能开 ...
- Java第三周总结报告
本周做了什么? 本周利用Java语言重新回顾了条件结构与循环结构和字符串的处理等问题,认识到了Java与C/C++的在这两个方面的不同. 下周准备做什么? 学习Java面向对象的有关知识,包括对象与类 ...
- NOIP2017 时间复杂度 大模拟
再写一道大模拟题. 由于是限时写的,相当于考场代码,乱的一批. 题目链接:P3952 时间复杂度 先记几个教训: 字符串形式的数字比较大小老老实实写函数,字典序都搞错几次了 栈空的时候不但pop()会 ...
- iter的特殊用法以及偏函数partial
iter()的特殊用法 常规使用 iter(obj),会返现一个迭代器,如果 obj 不是可迭代对象,则会报错. 特殊用法(哨兵模式) iter(object[, sentinel]) sentine ...
- [Next] 二.next.js之组件
next.js 中的组件 next.js 里面的组件(页面)就是 react 里面的组件. 功能组件 在项目之中一个功能组件的创建 , 他可以和父组件放到一个文件里,也可以单独创建一个文件存放组件. ...