还是字符组合问题,直接针对题目建模(java,算法探讨)
2008-05-18 12:20
435 查看
保留版权,转载必须注明出处!
本blog首发于CSDN,niko7的个人空间。2008年5月18日。
题目要求:
写出用 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
这些字符拼出来的所有长度小于等于12位的文件名(扩展名不用考虑)
直接针对题目进行了建模,代码没有前面那些方法简练。
使用了两个 static private inner class,没有使用递归。
建模、编写、调试、改进完成,大概花了1个小时。
package niko7;
/** *//**
* 直接针对题目要求建立了模型,然后模拟进位,实现字符组合枚举。
*
* 模型如下:
* 总体是模拟了 转轮式 计数器,我想大家在老式电表上都见过。
* Rnumber对象是一个轮子,RnumberList 是一串轮子构成的计数器。
*
* 转载、引用必须保留此段信息。
* @author niko7,(顾法华,杭州)
* @email niko7@163.com
*
*/
public class AdvDemo
...{
/** *//**
* 计数器上的一个轮子
* @author 顾法华,杭州
*
*/
static private class Rnumber
...{
int index = -1;
char[] chars;
Rnumber high = null;
boolean goon = true;
/** *//**
* 建立最左边的轮子时用这个构造函数,告诉它计数过程中使用的字符,并且隐含的告诉它进制是多少。
* @param chars
*/
public Rnumber(char[] chars)
...{
this.chars = chars;
}
/** *//**
* 除了最高位,其余的轮子都用这个构造函数,使其可以与它的相邻高位协同。
* @param high
*/
public Rnumber(Rnumber high)
...{
this(high.chars);
this.high = high;
}
/** *//**
* 加1操作。
*/
public void add()
...{
this.index++;
if(this.index>=chars.length)//需要进位了
...{
if(null!=this.high)
...{
this.index = 0;
this.high.add();
}
else
...{
this.index = -1;
this.goon = false;
}
}
}
/**//*
* 显示出从这个位置的左边几个轮子上的数字。
* @see java.lang.Object#toString()
*/
public String toString()
...{
StringBuffer sb = new StringBuffer();
Rnumber p = this;
while(null!=p && p.index>=0)
...{
sb.insert(0, p.chars[p.index]);
p = p.high;
};
return sb.toString();
}
}
/** *//**
* 一串轮子构成的计数器。
* @author 顾法华,杭州
*
*/
static private class RnumberList
...{
Rnumber high = null;
Rnumber low = null;
/** *//**
* 告诉计数器进制过程中使用的字符,计数器需要的位数。隐含的告诉了所有位置上的进制。
* @param chars
* @param maxLen
*/
public RnumberList(char[] chars,int maxLen)
...{
this.high = new Rnumber(chars);
Rnumber p = this.high;
for(int i=1; i<maxLen; i++)
...{
this.low = new Rnumber(p);
p = this.low;
}
//将建好的计数器需要进入准备状态
this.add();
}
/** *//**
* 计数器加1操作。
*/
public void add()
...{
if(isFull())
...{
throw new IllegalStateException("已经到顶了,不能再进位了!");
}
else
...{
this.low.add();
}
}
/** *//**
* 判断是否已经最大数值了。
* @return
*/
public boolean isFull()
...{
return !this.high.goon;
}
/**//*
* 显示当前的数值,用构建时候给定的字符(包括字符的顺序)显示出来。
* @see java.lang.Object#toString()
*/
public String toString()
...{
return (this.isFull()?"溢出!":this.low.toString());
}
}
public static void main(String[] args)
...{
//允许组成的字符串的最大长度
int maxLen = 12;
//组成字符串的字符
char[] chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
//char[] chars = "012".toCharArray();
RnumberList r = new RnumberList(chars,maxLen);
for( int i=0; !r.isFull() ; r.add())
...{
System.out.println( i++ +" "+ r.toString() );
}
}
}
本blog首发于CSDN,niko7的个人空间。2008年5月18日。
题目要求:
写出用 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
这些字符拼出来的所有长度小于等于12位的文件名(扩展名不用考虑)
直接针对题目进行了建模,代码没有前面那些方法简练。
使用了两个 static private inner class,没有使用递归。
建模、编写、调试、改进完成,大概花了1个小时。
package niko7;
/** *//**
* 直接针对题目要求建立了模型,然后模拟进位,实现字符组合枚举。
*
* 模型如下:
* 总体是模拟了 转轮式 计数器,我想大家在老式电表上都见过。
* Rnumber对象是一个轮子,RnumberList 是一串轮子构成的计数器。
*
* 转载、引用必须保留此段信息。
* @author niko7,(顾法华,杭州)
* @email niko7@163.com
*
*/
public class AdvDemo
...{
/** *//**
* 计数器上的一个轮子
* @author 顾法华,杭州
*
*/
static private class Rnumber
...{
int index = -1;
char[] chars;
Rnumber high = null;
boolean goon = true;
/** *//**
* 建立最左边的轮子时用这个构造函数,告诉它计数过程中使用的字符,并且隐含的告诉它进制是多少。
* @param chars
*/
public Rnumber(char[] chars)
...{
this.chars = chars;
}
/** *//**
* 除了最高位,其余的轮子都用这个构造函数,使其可以与它的相邻高位协同。
* @param high
*/
public Rnumber(Rnumber high)
...{
this(high.chars);
this.high = high;
}
/** *//**
* 加1操作。
*/
public void add()
...{
this.index++;
if(this.index>=chars.length)//需要进位了
...{
if(null!=this.high)
...{
this.index = 0;
this.high.add();
}
else
...{
this.index = -1;
this.goon = false;
}
}
}
/**//*
* 显示出从这个位置的左边几个轮子上的数字。
* @see java.lang.Object#toString()
*/
public String toString()
...{
StringBuffer sb = new StringBuffer();
Rnumber p = this;
while(null!=p && p.index>=0)
...{
sb.insert(0, p.chars[p.index]);
p = p.high;
};
return sb.toString();
}
}
/** *//**
* 一串轮子构成的计数器。
* @author 顾法华,杭州
*
*/
static private class RnumberList
...{
Rnumber high = null;
Rnumber low = null;
/** *//**
* 告诉计数器进制过程中使用的字符,计数器需要的位数。隐含的告诉了所有位置上的进制。
* @param chars
* @param maxLen
*/
public RnumberList(char[] chars,int maxLen)
...{
this.high = new Rnumber(chars);
Rnumber p = this.high;
for(int i=1; i<maxLen; i++)
...{
this.low = new Rnumber(p);
p = this.low;
}
//将建好的计数器需要进入准备状态
this.add();
}
/** *//**
* 计数器加1操作。
*/
public void add()
...{
if(isFull())
...{
throw new IllegalStateException("已经到顶了,不能再进位了!");
}
else
...{
this.low.add();
}
}
/** *//**
* 判断是否已经最大数值了。
* @return
*/
public boolean isFull()
...{
return !this.high.goon;
}
/**//*
* 显示当前的数值,用构建时候给定的字符(包括字符的顺序)显示出来。
* @see java.lang.Object#toString()
*/
public String toString()
...{
return (this.isFull()?"溢出!":this.low.toString());
}
}
public static void main(String[] args)
...{
//允许组成的字符串的最大长度
int maxLen = 12;
//组成字符串的字符
char[] chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
//char[] chars = "012".toCharArray();
RnumberList r = new RnumberList(chars,maxLen);
for( int i=0; !r.isFull() ; r.add())
...{
System.out.println( i++ +" "+ r.toString() );
}
}
}
相关文章推荐
- 计算字符的组合量并一一列举出来(java,算法探讨)
- 请用Java实现一个算法:由a-z、0-9组成3位的字符密码,并打印所有可能的密码组合。
- 针对较大基数的排列组合算法Java实现类(n选m)
- 【leetcode】【Single Number题目】java 异或运算解决数字出现偶数次还是奇数次问题||HashMap
- 用改过的“数字进制转换”枚举字符组合,这是简化的版本。(java,算法研究)
- 探讨Java中函数是值传递还是引用传递问题
- 【字符编码】Java字符编码详细解答及问题探讨
- Java 算法设计 多数组排列组合问题
- 用JAVA编写一个算法实现对一个字符数组的所有元素的所有组合
- [算法学习]Java实现字符序列全组合
- java算法之字符组合排序
- 关于新手用java写题目,遇到的字符和字符串问题
- java中leetcode题目求字符创匹配的问题
- java字节流,字符流问题怎么判断一个文件要用字节流还是用字符流
- JAVA代码—算法基础:因子组合问题
- 三种算法求最大子段和问题——Java实现
- java网络编程中使用字符流还是字节流
- java中char类型的默认值是 '\u0000' 吗?是空字符还是空格?
- Java问题解决:"错误:编码GBK 的不可映射字符"
- [转贴]说说单词智能纠错算法--探讨思考问题的方法