在网上看到这个题,觉得很有意思,也算是一种方法。。。但是复杂度同样很高,生成全排列本身需要很大复杂度。

题目:现在有 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不完全排列生成的更多相关文章

  1. C#冒泡算法复习

    C#冒泡算法复习 冒泡算法的意思:每一趟找到一个最小或最大的数放到最后面,比较总数的n-1次(因为比较是2个双双比较的) 第一层循环表示进行比较的次数,总共要比较(数的)-1次 (因为比较是2个双双比 ...

  2. 【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成

           本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...

  3. HDU 1027 Ignatius and the Princess II 排列生成

    解题报告:1-n这n个数,有n!中不同的排列,将这n!个数列按照字典序排序,输出第m个数列. 第一次TLE了,没注意到题目上的n和m的范围,n的范围是小于1000的,然后m的范围是小于10000的,很 ...

  4. ACM-挑战题之排列生成

    题目描述:挑战题之排列生成 一自然数N,设N为3,则关于N的字典序排列为123,132,213,231,312,321.对于一个自然数N(1<= N <= 9 ) , 你要做的便是生成它的 ...

  5. 【CF1443E】Long Permutation 题解(排列生成模板)

    原题链接 题意简介 给定一个长度为 n 的排列 {1,2,3,...,n} .现有两种操作: 对某个区间 [l,r] 求和 将排列往后推 x 次 (按字典序) 其中 \(n,q \leq 2\time ...

  6. 【转】常用算法复习及实现(C++版)

    一.霍夫曼树实现 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大 ...

  7. 算法复习——差分约束(ssoi种树)

    题目: 题目描述 为了绿化乡村,H 村积极响应号召,开始种树了. H 村里有 n 幢房屋,这些屋子的排列顺序很有特点,在一条直线上.于是方便起见,我们给它们标上 1-n .树就种在房子前面的空地上. ...

  8. 算法复习周------“动态规划之‘最长公共子序列’”&&《计蒜课》---最长公共子串题解

    问题描述: 这个问题其实很容易理解.就是给你两个序列X={x1,x2,x3......xm} Y={y1,y2,y3......ym},要求找出X和Y的一个最长的公共子序列. 例:Xi={A, B, ...

  9. 18级北航软件学院算法复习--Samshui

    A 比特手链 简单模拟 判断 贪心 叶姐要想哥赠送一串比特手链,这个手链由0和1组成.想哥买了手链B,无意间得知叶姐想要同样长度的手链A.想哥囊中羞涩,只能手工调整手链.他希望最少通过以下操作进行最少 ...

随机推荐

  1. IOS CocoaPods的用法

    自从有了CocoaPods以后,这些繁杂的工作就不再需要我们亲力亲为了,只需要我们做好少量的配置工作,CocoaPods会为我们做好一切   一.什么是CocoaPods 1.为什么需要CocoaPo ...

  2. 【神经网络与深度学习】CIFAR-10数据集介绍

    CIFAR-10数据集含有6万个32*32的彩色图像,共分为10种类型,由 Alex Krizhevsky, Vinod Nair和 Geoffrey Hinton收集而来.包含50000张训练图片, ...

  3. Lambda表达式动态组装查询条件

    最近比较闲,年底了,项目也进入尾声:每天就是维护一下系统,整理整理文档,整理知识点,这样才觉得有点意思: 问题 在使用Linq的where()查询的时候,不知道大家是怎么动态组装多个查询条件时,是怎么 ...

  4. Hive Error : Java heap space 解决方案

    Java heap space问题一般解决方案: 设置 set io.sort.mb=10; 排序所使用的内存数量,默认值是100M,和mapred.child.java.opts相对应,opts默认 ...

  5. hibernate update-->参数绑定

    Hibernate 更新数据库 参数绑定总结: 一.query.setParameter(属性名,真实值,类型); String hql="update User u set u.userN ...

  6. selenium获取微博用户粉丝数

    selenum的安装 selenium文档 获取微博用户粉丝数 from selenium import webdriver from time import sleep wd = webdriver ...

  7. python——元组方法及字符串方法

    元组方法 Tup.count():计算元组中指定元素出现的次数 Tup.count('c') Tup.index():在元组中从左到右查找指定元素,找到第一个就返回该元素的索引值 Tup.index( ...

  8. 01Spring基于xml的IOC配置--入门

    01Spring基于xml的IOC配置 1.创建一个普通的maven工程 1.1 选择maven,不用骨架,点击下一步. 1.2 填写GroupId.ArtifactId.Version.填完点击下一 ...

  9. 手把手教你如何安装使用webpack vue cli

    1.安装node.js:https://nodejs.org/en/download/(看电脑的系统是多少位下载相应版本) 我下载的是Windows Installer(.msi) x64 2.打开c ...

  10. 传输层协议之TCP/UDP

    1.UDP UDP协议是面向无连接的,即不需要在正式传递数据前先链接双方,UDP协议只是数据报文的搬运工,不保证有序且不丢失的传递到对端,且UDP协议无任何控制流量的算法,UDP相对于TCP更加轻便. ...