java循环换位合并算法_用java实现换位法生成全排列

import java.util.ArrayList;

import java.io.*;

//换位法生成全排列

class ReplaceArrangement{

//从控制台读入数据

private static String readDataFromConsole(String prompt) {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String str = null;

try {

System.out.print(prompt);

str = br.readLine();

} catch (IOException e) {

e.printStackTrace();

}

return str;

}

public static void main(String args[]){

class Node{

int value = 0;// 元素值

int dir = -1;// 0 : 左向箭头,1:有向箭头

}

System.out.println("------换位法求全排列---------");

System.out.println("----第一个排列必须有序------");

int n = 0;//元素个数

boolean flag = true;//从控制台读入数据不合法的话,该值一直为true

while(flag){

try{

n = Integer.parseInt(readDataFromConsole("请输入待排序元素个数: "));

flag = false;

}catch(Exception e){

System.out.println("请输入整数.");

}

}

flag = true;

ArrayList nodes = new ArrayList(n);

Node node = null;

for(int i = 1;i <= n;i++){//排列初始化

node = new Node();

while(flag){

try{

node.value = Integer.parseInt(readDataFromConsole("请输入第" + i + "个元素的值: "));

flag = false;

}catch(Exception e){

System.out.println("请输入整数.");

}

}

flag = true;

node.dir = 0;

nodes.add(node);

node = null;

}

for(int i = 0;i < n;i++){

System.out.print(nodes.get(i).value + "\t");

}

System.out.println();

int count = 1;

while(true){

int j = 0; // 记录最大活动整数下标

int Max = 0;

for(int i = 0;i < n;i++){ // 找出最大活动整数

if(0 == i && 0 == nodes.get(i).dir){

Max = Max;

}else if(n-1 == i && 1 == nodes.get(i).dir){ /// 此处应该是一次空操作,不可以轻易将Max 置为 0 ********

Max = Max;

}else if(0 == nodes.get(i).dir && i>0 && nodes.get(i).value>nodes.get(i - 1).value && nodes.get(i).value>Max){

Max = nodes.get(i).value;

j = i;

}else if(1 == nodes.get(i).dir && inodes.get(i + 1).value && nodes.get(i).value > Max){

Max = nodes.get(i).value;

j = i;

}

}

//cout << endl;

//cout << j << " " << Max << endl;

if( 0 == Max ) // 没有活动整数

break;

if( 0 == nodes.get(j).dir) // 交换最大整数与其相邻的数及方向

{

int temp,dirtemp;

temp =nodes.get(j).value;

dirtemp=nodes.get(j).dir;

nodes.get(j).value=nodes.get(j - 1).value;

nodes.get(j).dir=nodes.get(j - 1).dir;

nodes.get(j - 1).value=temp;

nodes.get(j - 1).dir=dirtemp;

}

else if( 1 == nodes.get(j).dir)

{

int temp,dirtemp;

temp =nodes.get(j).value;

dirtemp=nodes.get(j).dir;

nodes.get(j).value=nodes.get(j + 1).value;

nodes.get(j).dir=nodes.get(j + 1).dir;

nodes.get(j + 1).value=temp;

nodes.get(j + 1).dir=dirtemp;

}

for(int i=0;i

{

if(nodes.get(i).value>Max)

{

if(0 == nodes.get(i).dir){

nodes.get(i).dir=1;

}else if(1 == nodes.get(i).dir){

nodes.get(i).dir=0;

}

}

}

for(int i=0;i

System.out.print(nodes.get(i).value + "\t");

}

count++;

System.out.println();

}

System.out.println("排列总数为:" + count);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。 首先,让我们来了解一下移位 XOR 加密算法的原理。这种加密算法是通过将明文中的每个字符与一个密钥中的对应字符进行异或操作来实现的。具体来说,如果明文为 M,密钥为 K,加密后的密文为 C,那么加密过程如下: * 对于明文中的每个字符 M[i],将其与密钥中对应的字符 K[i%len(K)] 进行异或操作,得到密文中的对应字符 C[i]。 解密过程与加密过程类似,只需要将密钥中的字符和密文中的字符进行异或操作即可。 接下来,我们来看一下如何使用 Python 实现移位 XOR 加密算法的还原过程。假设我们已经得到了加密后的密文 C 和密钥 K,那么还原过程如下: ```python def decrypt(ciphertext, key): plaintext = "" for i in range(len(ciphertext)): # 对每个密文字符和密钥字符进行异或操作 plainchar = chr(ord(ciphertext[i]) ^ ord(key[i % len(key)])) plaintext += plainchar return plaintext ``` 在上面的代码中,我们首先定义了一个 decrypt 函数,它接受两个参数:密文和密钥。然后,我们使用一个 for 循环遍历密文中的每个字符,并将其与密钥中对应的字符进行异或操作,最终得到还原后的明文。 注意,在 Python 中,我们可以使用 ord 函数将字符转换为 ASCII 码,使用 chr 函数将 ASCII 码转换回字符。另外,由于 Python 中的字符串是不可变的,这里我们使用一个空字符串 plaintext 来逐步构建还原后的明文。 希望这个答案能够帮到你!如果你有其他问题,可以继续问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值