C++ 输出3个俄语键盘字母排列ABC的所有排列方式的问题

如“abc”输出结果为:“abc”,“acb”,“bac”,“bca”,“cab”,“cba”
public class AllCombString {
//组合个数
public static void main(String[] args) {
& String str = "123";
& char[] c = str.toCharArray();
& println(c)
& t++;
& allCombString(c,0);
& System.out.println(t);
public static void allCombString(char[] c,int s){
& int l = c.
& if(l-s==2){
&& char temp = c[l-1];
&& c[l-1] = c[l-2];
&& c[l-2] =
&& println(c);
&& t++;
& }
& else{
&& for(int i=s;i&l;i++){
&&& moveToHead(c,i,s);
&&& char ct[] = new char[l];
&&& System.arraycopy(c, 0, ct, 0, l);//保持其他元素位置不变
&&& allCombString(ct,s+1);
&& }
& }
public static void moveToHead(char[] c,int id,int s){
& if(id&s&&id&c.length){
&& char temp = c[id];
&& for(int i=i&s;i--){
&&& c[i] = c[i-1];
&& }
&& c[s] =
&& println(c);
&& t++;
& }
public static void println(char[] c){
& System.out.println(new String(c));
}
}
输出结果:
123
132
213
231
321
312
6
设计思路:
1、n个字符,顺序选取其中第1个;
2、在剩下的n-1个字符中,再选取其中的第1个;
3、若剩余的字符只剩下2个,则这两个字符交换位置;若不是,则继续第2步。
4、这是一个典型的递归,无论有多少个字符,到最后只需交换最后两个字符即可。
5、为了能按顺序选取字符(因为递归之后会影响字符的顺序,如:“abcd”经过第一轮递归之后变成“adbc”,这时再执行第2步的话,取到的字符是“d”,而不是“b”),所以这里使用了数组拷贝,for循环不受递归的影响。(这个问题想了老半天,暂时只能用这种方法,即使效率比较低)。
6、组合的个数是字符个数的阶层,如“abc”,组合个数为3!=6
不知道大家有没有更好的方式
论坛回复 /
(8 / 5209)
楼主的代码看的我蛋疼,最后还是看明白了。
顺着楼主的思路我帮你改了下代码,不需要复制数组,而且更容易理解了。
楼主这个算法是自己想出来的吗,很厉害,我肯定想不出来。。。
public class AllCombString {
public static int t=0;// 组合个数
public static void main(String[] args) {
String str = "123";
char[] c = str.toCharArray();
//println(c);
allCombString(c, 0);
System.out.println(t);
public static void allCombString(char[] c, int s) {
int len = c.
if (s == len-1) {
println(c);
for (int i = i & i++) {
moveToHead(c, i, s);
//char ct[] = new char[l];
//System.arraycopy(c, 0, ct, 0, l);// 保持其他元素位置不变
allCombString(c, s + 1);
moveBack(c, i, s);
//既然改变了位置,那就再改回来
public static void moveToHead(char[] c, int id, int s) {
if (id & s && id & c.length) {
char temp = c[id];
for (int i = i & i--) {
c[i] = c[i - 1];
//println(c);
public static void moveBack(char[] c, int id, int s) {
if (id & s && id & c.length) {
char temp = c[s];
for (int i = i & i++) {
c[i] = c[i+1];
//println(c);
public static void println(char[] c) {
System.out.println(new String(c));
这是我在一次上机笔试时遇到的题目,当时没想出来,后来回家想了一个晚上才写出来,呵呵。
你改的不错!
如“abc”输出结果为:“abc”,“acb”,“bac”,“bca”,“cab”,“cba”
public class AllCombString {
//组合个数
public static void main(String[] args) {
& String str = "123";
& char[] c = str.toCharArray();
& println(c)
& t++;
& allCombString(c,0);
& System.out.println(t);
public static void allCombString(char[] c,int s){
& int l = c.
& if(l-s==2){
&& char temp = c[l-1];
&& c[l-1] = c[l-2];
&& c[l-2] =
&& println(c);
&& t++;
& }
& else{
&& for(int i=s;i&l;i++){
&&& moveToHead(c,i,s);
&&& char ct[] = new char[l];
&&& System.arraycopy(c, 0, ct, 0, l);//保持其他元素位置不变
&&& allCombString(ct,s+1);
&& }
& }
public static void moveToHead(char[] c,int id,int s){
& if(id&s&&id&c.length){
&& char temp = c[id];
&& for(int i=i&s;i--){
&&& c[i] = c[i-1];
&& }
&& c[s] =
&& println(c);
&& t++;
& }
public static void println(char[] c){
& System.out.println(new String(c));
}
}
输出结果:
123
132
213
231
321
312
6
设计思路:
1、n个字符,顺序选取其中第1个;
2、在剩下的n-1个字符中,再选取其中的第1个;
3、若剩余的字符只剩下2个,则这两个字符交换位置;若不是,则继续第2步。
4、这是一个典型的递归,无论有多少个字符,到最后只需交换最后两个字符即可。
5、为了能按顺序选取字符(因为递归之后会影响字符的顺序,如:“abcd”经过第一轮递归之后变成“adbc”,这时再执行第2步的话,取到的字符是“d”,而不是“b”),所以这里使用了数组拷贝,for循环不受递归的影响。(这个问题想了老半天,暂时只能用这种方法,即使效率比较低)。
6、组合的个数是字符个数的阶层,如“abc”,组合个数为3!=6
不知道大家有没有更好的方式
楼主C/C++程序员出身.
鉴定完毕
浏览: 18044 次
来自: 杭州
支持,要是能再详细点就好了
pengmj 写道什么是hashcode
分析Hash ...
hangdian_123 写道
不好意思,还没怎么发过言。我一 ...
这里有篇对hashmap的深度解析。。。。大家可以看看http ...
不好意思,还没怎么发过言。我一直有个疑惑,想请问一下楼主。
S ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'已解决问题
用C++如何输出如下形式的三角形形状的九九乘法表:
浏览次数:4548
用手机阿里扫一扫
最满意答案
#include&&stdio.h&#include&&string.h&int&main(){&&&&&&&&int&i&=&0,&j&=&0;&&&&&&&&printf(&\t%4s&,&&*&);&&&&&&&&for&(i&=&1;&i&&=&9;&++i)&&&&&&&&&&&&&&&&printf(&\t%4d&,&i);&&&&&&&&printf(&\n&);&&&&&&&&printf(&----------------------------------------------------------------------------------------------------\n&);&&&&&&&&for&(i&=&1;&i&&=&9;&++i)&&&&&&&&{&&&&&&&&&&&&&&&&printf(&\t%4d&,&i);&&&&&&&&&&&&&&&&for&(j&=&1;&j&&=&i;&++j)&&&&&&&&&&&&&&&&&&&&&&&&printf(&\t%4d&,&i&*&j);&&&&&&&&&&&&&&&&printf(&\n&);&&&&&&&&}&&&&&&&&return&0;}
答案创立者
以企业身份回答&
正在进行的活动
生意经不允许发广告,违者直接删除
复制问题或回答,一经发现,拉黑7天
快速解决你的电商难题
店铺优化排查提升2倍流量
擅长&nbsp 店铺优化
您可能有同感的问题
扫一扫用手机阿里看生意经
问题排行榜
当前问题的答案已经被保护,只有知县(三级)以上的用户可以编辑!写下您的建议,管理员会及时与您联络!
server is okc++全排列 3:全排列查看提交统计提问总时间限制:1000ms内存限制:65536kB描述给定一个由不同的小写字母组成
c++全排列 3:全排列查看提交统计提问总时间限制:1000ms内存限制:65536kB描述给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列.我们假设对于小写字母有'a' < 'b' < ...< 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列.输入输出只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间.输出输出这个字符串的所有排列方式,每行一个排列.要求字母序比较小的排列在前面.字母序如下定义:已知S = s1s2...sk ,T = t1t2...tk,则S < T 等价于,存在p (1
for(z=i;z&=l;z++)应该是z的初始值为i+1,至少这里是不对的 再问: ???dz?'?abc??????????
我有更好的回答:
剩余:2000字
与《c++全排列 3:全排列查看提交统计提问总时间限制:1000ms内存限制:65536kB描述给定一个由不同的小写字母组成》相关的作业问题
#include "stdafx.h"#include#include#includchar a[102][102];int s=0;//计数器int main(){printf("请输入N:");scanf("%d",&n);printf("请
#include #include int main(int argc, char *argv[]){ int i,a[128]={0}; char s[100]; gets(s); for(i=0;s[i]!='\0';i++) if((s[i]>='a')&&(s[i]
在右上角点“我的知道”,再点“我的提问”,就能看到你提过的所有问题,以及别人给你的回答了.
wps2012的字数统计在审阅菜单栏下左边第2个.⊙﹏⊙
1. 美音最大的特点就是有卷舌音,而英音没有卷舌音的.基本所有单词中 字母r之前的原因都卷舌,比如first,early等,美国人发音就把舌头上卷,而英音读起来舌头是伸平的,所以抓住这点你基本就能区分个八九不离十. 2. 美国英语听起来比较圆润(所以有时会不够清晰),那是他们卷舌音多.英音听起来比较清晰利索. 3. 美
统计一个字符串中出现某个字母的次数(注意区分大小写).String类中的相关方法(具体用法请查看JDK帮助文档):length( ):计算字符串长度,得到一个int型数值;indexOf( ):在字符串中定位某个子串,并返回位置编号substring( ):截取字符串中的一部分,并作为一个新字符串返回;equals(
如果是pp[0]++;你能理解吗?++是自增运算符,如比pp[0]++就相当于:pp[0]=pp[0]+1;那么*tt-'a'是什么意思呢?这是两个字符的运算,其实字符在电脑中是用一个字节表示的ASCII码,比如'a'这个字符,在电脑中表示为97,而b,c,d,……是依次递增的,两个字符在C语言中可以直接加减,其结果就
#include "stdio.h"main(){char s[81],c;int i,num=0,word=0;printf("请输入一行英文:\n");gets(s);for(i=0;(c=s[i])!='\0';i++) /*依次读取字符,直到遇到空字符结束*/if(c==' ') word=0; /* 若读取的
1A赛4场,说明A和BCDE各赛了一场,那么BCD和除了A以外的人赛的场数是2 1 0可以知道B和CE各赛一场,所以E赛了2场比赛.比赛结束每个人都应该是4场比赛,每赛一场两个人都加1,所以还剩于比赛场数位(4*5-4-3-2-1-2)/2=42 如果只有一个人借书,那么2本书就够了.如果要保证每一个人都有书,那么需要
Linear regression analysis is a statistical method used to determine the impact oile variable (or a group of variables) has on another variable.It provides the
可以的,可以使用跨表统计个数函数举例:个表的员工名称在B列,=COUNTA(Sheet1:Sheet3!B2:B300)
看是什么型号和品牌的机器了,建议你提供型号和厂家,或者直接到厂家网站上查一查.这方面的功能都有的,但是,不同型号的计价器保存的数据量有区别.
设李明做了X分钟,王刚做了Y分钟x+y=5x=7y=5
假设A列是月份,B列是总销量则在K2中输入如下公式:=COUNTIF(B:B,"
小红做了(7 )分钟,小丽做了( 5 )分钟.
假如12分钟均是李明算,算了12*15=180题,共195题,即王刚算了(195-180)/(18-15)=5分钟,李明算了7分钟.
设李明用了x分钟,王刚用了y分钟,根据题意得{x+y=5解得{x=7y=5
点的话应该不行,要用“what time”c语言问题:盘输入一个仅由小写字母组成的字符串,输出以该串中任&#160;取M个字母的所有排列及排列总数。_百度知道
c语言问题:盘输入一个仅由小写字母组成的字符串,输出以该串中任&#160;取M个字母的所有排列及排列总数。
问题描述:键盘输入一个仅由小写字母组成的字符串,输出以该串中任&#160;取M个字母的所有排列及排列总数。例如:输入字符串abcd,输入m=3则输出为:abc,abd,acd,bcd,n=4用c语言写,急求,好的加分!
我有更好的答案
#include&stdio.h&#include&stdlib.h&#include&string.h&static&int&v[1024];//访问数组&static&char&t[],&a[1024];static&int&j&=&0,&count&=&0;void&pailie(char&*s,&int&M,&int&k){ int&i; if&(j&!=&M) {
for&(i&=&0;&i&&&strlen(s);&i++)
if&(v[i]&==&0)
a[j]&=&s[i];
pailie(s,&M,&i);
} } else {
a[j]&=&&#39;\0&#39;;
for&(i&=&0;&i&&&&i++)
if&(strcmp(t[i],&a)&==&0)i&=&count&+&1;
if&(i&==&count)
strcpy(t[count],&a);
} } j--; v[k]&=&0;}int&main(){ char&s[1024]; int&M; printf(&请输入字符串:&); gets(s); printf(&\n请输入所取字符个数M:&); scanf(&%d&,&&M); for&(int&i&=&0;&i&&&strlen(s);&i++)
v[i]&=&0; pailie(s,&M,&0); printf(&\n得到的排列总数为:%d\n&,&count); printf(&\n得到的所有排列为:\n&); for&(int&i&=&0;&i&&&&i++)
printf(&%s\t&,&t[i]); printf(&\n\n&); system(&pause&);}
为您推荐:
其他类似问题
小写字母的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。从A、B、C、D四个字母中任取3个不同的字母,共有多少种取法?编写c++程序,输出所有取法中字母排_百度知道
从A、B、C、D四个字母中任取3个不同的字母,共有多少种取法?编写c++程序,输出所有取法中字母排
从A、B、C、D四个字母中任取3个不同的字母,共有多少种取法?编写c++程序,输出所有取法中字母排列。
我有更好的答案
C(4,3)=(4x3x2x1)÷(3x2x1)=4(种)ABC,ABD,ACD,BCD
采纳率:72%
如果不算顺序的话4种。同上
为您推荐:
其他类似问题
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 英文字母顺序排列 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信