输入一个数字获取对应范围及长度的所有不重复的数字,例如:输入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