日期:2014-05-20  浏览次数:20755 次

一道算法题,求优化
题目:
立方数 41063625 (3453) 通过排列可以得到两个另外的立方数: 56623104 (3843) 和 66430125 (4053)。 实际上41063625是最小的三个(不多不少)排列是立方数的立方数。
 
找出最小的立方数,其五个(不多不少)排列是立方数。

我的思路是:
设定一个变量p,定义一个长度为p的String数组,
将1到p每个数的立方转换为字符串后,将其各位按升序排列,然后放到这个String数组中,
如果在相同长度的字符串中恰好能找到五个相同的字符串,那么最先出现的那个字符串的下标加上一的立方就是所要求的数了,如果没有找到,就增加p的值,扩大查找范围,直到找到为止,
下面是我写的代码,虽然在eclipse上运行,结果一下子就出来了,但感觉定义的数组太大了,
所以想优化一下,请大家帮忙!!刚注册,没多少分,大家见谅!!!


import java.util.Arrays;

public class Oula_62_2 {
final int P=10000;
String[] arr=new String[P];
public static void main(String[] args) {
new Oula_62_2();
}
public Oula_62_2(){
for(int i=1;i<=P;i++){
char[] ch=(((long)i)*i*i+"").toCharArray();
Arrays.sort(ch);
arr[i-1]=new String(ch);
}
int n;
for(int i=0;i<P;i++){
n=1;
int len=arr[i].length();
for(int j=i+1;j<P&&len==arr[j].length();j++){
//System.out.println(arr[i].equals(arr[j]));
if(arr[i].equals(arr[j]))n++;
}
if(n==5){
System.out.println(((long)i+1)*(i+1)*(i+1));
break;
}
}
}
}

------解决方案--------------------
把数组定义成long[]
	public void find2()
{
long[] arr = new long[P];
for (int i = 1; i <= P; i++)
{
char[] ch = (((long) i) * i * i + "").toCharArray();
Arrays.sort(ch);
int count=ch.length;
for(int j=0;j<count/2;j++)
{
char tmp=ch[j];
ch[j]=ch[count-1-j];
ch[count-1-j]=tmp;
}
arr[i - 1] = Long.parseLong(new String(ch));
}
int n;
for (int i = 0; i < P; i++)
{
n = 1;
for (int j = i + 1; j < P ; j++)
{
// System.out.println(arr[i].equals(arr[j]));
if (arr[i]==arr[j])
n++;
}
if (n == 5)
{
System.out.println(""+(i+1)+"^3="+((long) i + 1) * (i + 1) * (i + 1));
break;
}
}
}

------解决方案--------------------
所以要倒序排列,0 放到最后去
------解决方案--------------------
啥是立方数。