import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Zuhe {
public static void main(String[] args) throws Exception {
Zuhe zhuhe = new Zuhe();
zhuhe.printAll("1,2/9,3,4/10,5/6/7/8");
}
/**
*
*/
public void printAll(String input) throws Exception {
String[] elementArray = input.split(",");
Map<String, String[]> elementAlias = new HashMap<String, String[]>();
int length = elementArray.length;
for (int i = 0; i < length; i++) {
if (elementArray[i].indexOf("/") > 0) {
String[] alias = elementArray[i].split("/");
elementArray[i] = alias[0];
String[] aliasArray = new String[alias.length - 1];
System.arraycopy(alias, 1, aliasArray, 0, alias.length - 1);
elementAlias.put(alias[0], aliasArray);
}
}
List<String[]> result = new ArrayList<String[]>();
for (int i = 2; i <= length; i++) {
result.addAll(combine(elementArray, i));
}
result = processAlias(result,elementAlias);
print(result);
}
public List<String[]> combine(String[] elements, int m) throws Exception {
int n = elements.length;
if (m > n) {
throw new Exception("m>n");
}
List<String[]> result = new ArrayList<String[]>();
int[] bs = new int[n];
for (int i = 0; i < n; i++) {
bs[i] = 0;
}
//初始化
for (int i = 0; i < m; i++) {
bs[i] = 1;
}
if (m == n) {
result.add(print(bs, elements, m));
return result;
}
boolean flag;
boolean tempFlag;
int pos;
int sum;
//首先找到第一个10组合,然后变成01,同时将左边所有的1移动到数组的最左边
do {
sum = 0;
pos = 0;
tempFlag = true;
result.add(print(bs, elements, m));
for (int i = 0; i < n - 1; i++) {
if (bs[i] == 1 && bs[i + 1] == 0) {
bs[i] = 0;
bs[i + 1] = 1;
pos = i;
break;
}
}
//将左边的1全部移动到数组的最左边
for (int i = 0; i < pos; i++) {
if (bs[i] == 1) {
sum++;
}
}
for (int i = 0; i < pos; i++) {
if (i < sum) {
bs[i] = 1;
} else {
bs[i] = 0;
}
}
//检查是否所有的1都移动到了最右边
for (int i = n - m; i < n; i++) {
if (bs[i] == 0) {
tempFlag = false;
break;
}
}
flag = !tempFlag;
} while (flag);
result.add(print(bs, elements, m));
return result;
}
private String[] print(int[] bs, String[] a, int m) {
String[] result = new String[m];
int pos = 0;
for (int i = 0; i < bs.length; i++) {
if (bs[i] == 1) {
result[pos] = a[i];
pos++;
}
}
return result;
}
private void print(List<String[]> l) {
for (String[] a : l) {
for (String anA : a) {
System.out.print(anA + " ");
}
System.out.println();
}
}
private List<String[]> processAlias(List<String[]> l, Map<String, String[]> alias) {
List<String[]> result = new ArrayList<String[]>();
result.addAll(l);
for (String[] a : l) {
for (int i = 0; i < a.length; i++) {
if (alias.containsKey(a[i])) {
String[] aliasArray = alias.get(a[i]);
for (String aliasElement : aliasArray) {
String[] b = new String[a.length];
System.arraycopy(a, 0, b, 0, a.length);
b[i] = aliasElement;
result.add(b);
}
}
}
}
return result;
}
}
分享到:
相关推荐
ECC算法校验工具ECC算法校验工具ECC算法校验工具
ECC(Error Correction Code,错误纠正码)是一种用于检测和纠正数据传输或存储过程中可能出现错误的技术。在IT领域,特别是嵌入式系统和存储设备中,ECC算法扮演着至关重要的角色,它能够提高数据的可靠性,确保...
ECC,全称为椭圆曲线密码学(Elliptic Curve Cryptography),是一种先进的公钥加密技术,被广泛应用于嵌入式系统中,因为其在安全性和效率方面具有显著优势。在明文嵌入式ECC加密方案中,我们通常会涉及到以下几个...
### 256字节ECC代码:深入解析与应用 #### ECC算法概览 **错误纠正码(Error Correction Code,简称ECC)**是一种在数据传输或存储过程中用于检测和纠正错误的编码技术。其核心在于能够在不重传原始数据的情况下...
ECC和RECC的区别 ECC和RECC是两种常见的服务器内存类型,它们之间的区别在于错误检查和纠正技术的实现方式。ECC是Error Checking and Correcting的简写,中文名称是“错误检查和纠正”,它是一种校验技术,能够实现...
**错误校验编码(Error Correction Code,ECC)在数字电子系统中扮演着至关重要的角色,尤其是在内存和数据传输领域。Verilog是一种硬件描述语言,用于设计和验证数字系统的逻辑功能。本篇将深入探讨ECC在Verilog中...
ECC,全称为椭圆曲线密码学(Elliptic Curve Cryptography),是一种基于数学难题——椭圆曲线离散对数问题的公钥加密算法。它在安全性与效率方面相较于传统的RSA算法具有显著优势,尤其在处理小尺寸密钥时。在通信...
ECC(椭圆曲线密码学)是一种现代的公钥加密技术,因其安全性高、效率优良而被广泛应用在网络安全、数字签名以及身份验证等领域。在这个项目中,开发者使用C语言和Visual Studio 2010创建了三个工具:ECC密钥生成器...
ECC,全称为椭圆曲线密码学(Elliptic Curve Cryptography),是一种基于数学难题——椭圆曲线上的离散对数问题的公钥加密技术。它在信息安全领域中被广泛应用,因为其安全性高且密钥长度相对较短,使得计算效率更高...
本项目"verilog_ecc_gen"专注于实现ECC(错误检测和校正码)的生成,特别是针对8位和16位数据流的编码。 ECC是一种有效的错误检测和纠正技术,特别是在存储器系统和数据传输中,它可以检测并修正由于噪声或硬件故障...
**标题:“FLASH-ECC校验算法的C语言实现”** 在存储系统中,尤其是在嵌入式设备中,Flash存储器由于其非易失性、低功耗和高密度等特点,被广泛使用。然而,Flash存储器在多次读写操作后可能会出现数据错误,这是...
ECC,全称为椭圆曲线密码学(Elliptic Curve Cryptography),是一种现代的公钥加密算法,以其高效性和安全性而被广泛应用于网络安全领域。基于OpenSSL库的ECC算法,能够实现包括密钥生成、加密和解密在内的多种功能...
**椭圆曲线加密算法(ECC)** 椭圆曲线加密算法是一种先进的公钥加密技术,以其高效性和安全性在现代密码学中占据重要地位。ECC是基于数学中的椭圆曲线理论构建的,与传统的RSA、DSA等算法相比,ECC在相同的安全...
ECC,全称为椭圆曲线密码学(Elliptic Curve Cryptography),是一种先进的加密技术,广泛应用于现代网络安全,包括数字签名、密钥交换和身份验证等领域。C#是一种常用的编程语言,尤其在开发Windows应用程序和游戏...
相比传统的RSA等加密算法,ECC在安全性和效率上具有显著优势。在C++环境下实现ECC算法,可以有效地进行数据加密与解密,保障信息安全。 首先,我们来理解椭圆曲线的基本概念。椭圆曲线是一类代数几何对象,其数学...
**基于FPGA的ECC算法实现** 在现代电子系统中,数据存储的可靠性至关重要,特别是在非易失性存储器(如NAND Flash)中。错误校验和纠正代码(Error Correction Codes,简称ECC)是一种有效提高数据完整性的技术。...
### NAND Flash中的ECC校验详解 #### 一、引言 随着计算机技术的发展,数据存储设备变得越来越重要。在众多存储解决方案中,NAND Flash因其高密度、低成本等特点成为了移动设备、固态硬盘等存储领域的首选。然而,...
ECC,全称为椭圆曲线密码学(Elliptic Curve Cryptography),是一种现代的公钥加密算法,以其高效性和安全性在信息安全领域广泛应用。在本文中,我们将深入探讨ECC数字签名的实现,主要关注C语言的编程实践。 首先...
### ECC校验原理详解 #### 一、ECC的基本概念 ECC(Error Checking and Correction)是一种广泛应用于存储器中的纠错技术,特别是针对NAND Flash这类非易失性存储器。其主要目的是检测并纠正存储过程中可能出现的...