还是字符组合问题,直接针对题目建模(java,算法探讨)

保留版权,转载必须注明出处!
本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.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);
        
forint i=0!r.isFull() ; r.add())
        
{
            System.out.println( i
++ +" "+ r.toString() );
        }

    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值