Java基础问题:输入一个数字获取对应范围及长度的所有不重复的数字,例如:输入3.则输出{123,132,213,231,321,312}

博客介绍了如何用Java编程解决一个问题:根据输入的数字生成所有不重复的数字组合。例如,输入3,程序将输出{123,132,213,231,321,312}。文章包含具体的实现代码,并表示存在改进空间。" 114217866,10546589,Java中的句柄管理与资源泄露,"['Java', '文件操作', '网络编程', '数据库连接', '资源管理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入一个数字获取对应范围及长度的所有不重复的数字,例如:输入3.则输出{123,132,213,231,321,312}

首先我们要理清楚解决问题的思路。
我们所需要获取的数字和所输入数字是什么关系?
如何来定义变量,并且赋值?
编写一个怎样的方法来获取我们所需要的数字?
废话不多说让我们来解决这些问题。 问题一:我们所需要获取的数字和所输入数字是什么关系?
根据问题我们可以获得的信息是:
1.输入3出现的每位数的取值范围就是1到3,所以判断出所需要获取的数字的取值范围。
2.输入3出现的每个数字都为三位数,所以判断出所需要获取的数字的位数。
3.每一位数字都是不同的。
问题二:如何来定义变量,并且赋值?
根据问题一的答案我们可以定义出两个变量
1.char [] valueRange 定义取值范围的数组,用来储存对应的取值范围。
2.char [] aimValue 定义目标值数组,用来存储获取到的每一个值。
3.通过重载构造方法来赋值。
问题三:编写一个怎样的方法来获取我们所需要的数字?
根据问题我们所能分析得出的思路是使用递归方法fibnacci()。
1.需要遍历valueRange数组来一个个填充进aimValue数组。
2.因为需要对aimValue数组添加元素,所以方法需要传入一个固定的下标值index来控制对应的aimValue的下标。
3.因为需要将valueRange的值赋值给aimValue中的元素所以使用for循环。
其他处理方法
根据问题需求我们还需要加入以下方法
1.处理每次获取到的数字每一位数都不重复的方法getStandard(char [] aimValue)。
2.将输入的数字转化为取值范围的方法disposeInteger(int i)。

以下是实现代码

import java.util.HashSet;

public class OnlyNumber {
    //存储取值范围
    private char[] valueRange;
    //存储目标字符串长度为字符串长度
    private char[] aimValue;
    //用来储存所有收集到的数字
    private static HashSet<String> hs = new HashSet<String>();

    /**
     * 空构造函数
     */
    public OnlyNumber(){}

    /**
     * 构造函数初始化取值范围和目标字符串
     * @param valueRange
     */
    public OnlyNumber(char[] valueRange)
    {
        this.valueRange = valueRange;
        //设置目标数字的长度
        this.aimValue = new char[valueRange.length];
    }

    public HashSet<String> getHs() {
        return hs;
    }
    public void setHs(HashSet<String> hs) {
        this.hs = hs;
    }

    /**
     * 判断目标字符串是否重复
     * @param aimValue
     * @return
     */
    public boolean getStandard(char [] aimValue)
    {
        //定义一个HashSet来接收数值中数字
        HashSet hs = new HashSet();
        //循环添加
        for (int i = 0; i < aimValue.length; i++) {
            hs.add(aimValue[i]);
        }
        /**
         * 判断char数组长度和Set集合大小是否相等。
         * 原理:Set集合会过滤掉相同的数据。
         */
        if(aimValue.length==hs.size())
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    /**
     * 通过递归算法获取所有能组成的字符串
     * @param index
     * @return
     */
    public void fibnacci(int index)
    {
        //遍历取值范围
        for (int i = 0; i < valueRange.length; i++) {
            //将valueRange的第i个值赋值给aimValue的第index的值
            aimValue[index] = valueRange[i];
            //判断valueRange是否还有空间接收值,如果有就递归。
            if(index+1<aimValue.length)
            {
                fibnacci(index+1);
            }
            //判断每个数字是否符合规范
            else if(getStandard(aimValue))
            {
                hs.add(String.valueOf(aimValue));
            }
        }
    }

    /**
     * 处理输入的参数
     * @param i
     */
    public void disposeInteger(int i) {
        String str = "";
        //将输入的参数转化为取值范围
        for (int j = 1; j <= i; j++) {
            str += j;
        }
        //实例化对象调用递归方法
        new OnlyNumber(str.toCharArray()).fibnacci(0);
    }

    /**
     * main函数
     * @param args
     */
    public static void main(String[] args) {
        OnlyNumber OnlyNumber = new OnlyNumber();
        OnlyNumber.disposeInteger(3);
        for (String string : OnlyNumber.getHs()) {
            System.out.println(string);
        }
    }
}

就是这样了会有很多不足的地方,需要改进的地方请补充。

日期:2017/8/27
时间:18:20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值