我正在用java编写一个程序,它将计算一个单词可以被置换/重新排列的方式。
例如,“HAPPY”这个词可以用60种方式重新排列。
我的过程是找到单词长度的阶乘,然后除以单词中出现的不同字母出现的阶乘的乘数。(使用递归)。
这是我的代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main
{
public static int factorial(int fact)
{
if(fact == 0)
return 1;
else if(fact == 0)
return 1;
return(fact * (factorial(fact - 1)));
}
public static void main(String args[]) throws IOException
{
String word;
int result;
int cases,lengthOfWord;
int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
cases = Integer.parseInt(br.readLine());
for(int iteration =1;iteration <= cases; iteration++)
{
word = br.readLine();
lengthOfWord = word.length();
a = lengthOfWord - word.replace("A", "").length();
b = lengthOfWord - word.replace("B", "").length();
c = lengthOfWord - word.replace("C", "").length();
d = lengthOfWord - word.replace("D", "").length();
e = lengthOfWord - word.replace("E", "").length();
f = lengthOfWord - word.replace("F", "").length();
g = lengthOfWord - word.replace("G", "").length();
h = lengthOfWord - word.replace("H", "").length();
i = lengthOfWord - word.replace("I", "").length();
j = lengthOfWord - word.replace("J", "").length();
k = lengthOfWord - word.replace("K", "").length();
l = lengthOfWord - word.replace("L", "").length();
m = lengthOfWord - word.replace("M", "").length();
n = lengthOfWord - word.replace("N", "").length();
o = lengthOfWord - word.replace("O", "").length();
p = lengthOfWord - word.replace("P", "").length();
q = lengthOfWord - word.replace("Q", "").length();
r = lengthOfWord - word.replace("R", "").length();
s = lengthOfWord - word.replace("S", "").length();
t = lengthOfWord - word.replace("T", "").length();
u = lengthOfWord - word.replace("U", "").length();
v = lengthOfWord - word.replace("V", "").length();
w = lengthOfWord - word.replace("W", "").length();
x = lengthOfWord - word.replace("X", "").length();
y = lengthOfWord - word.replace("Y", "").length();
z = lengthOfWord - word.replace("Z", "").length();
result = factorial(lengthOfWord) / (factorial(a)*factorial(b)*factorial(c)*factorial(d)*factorial(e)*factorial(f)*factorial(g)*factorial(h)*factorial(i)*factorial(j)*factorial(k)*factorial(l)*factorial(m)*factorial(n)*factorial(o)*factorial(p)*factorial(q)*factorial(r)*factorial(s)*factorial(t)*factorial(u)*factorial(v)*factorial(w)*factorial(x)*factorial(y)*factorial(z));
System.out.printf("Data set %d: %d\n",iteration,result);
}
}
}
但我认为这是非常冗长而且效率不高。
如何让这个程序更短更有效?
我也想知道解决这个计划的其他方法。
请协助。感谢。
答案 0 :(得分:2)
您可以将字母数保存在长度为26的数组中。此外,检查字符数的字符串替换过于复杂。只需遍历字符并计算它们即可。 letters[word.charAt(j) - 'A']
构造是一种技巧,它使得A的计数出现在索引0处,B处于索引1处等等。使用循环将因子乘以一起。并将单词转换为大写。最后,始终声明变量尽可能接近实际使用的位置。 (最后一个只是一般的良好做法。)
全部放在一起:
public static void main(String args[]) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int cases = Integer.parseInt(br.readLine());
for(int i = 0; i < cases; i++)
{
int letters = new int[26];
String word = br.readLine().toUpperCase();
int lengthOfWord = word.length();
for (int j = 0; j < lengthOfWord; j++)
{
letters[word.charAt(j) - 'A']++;
}
int factorialProduct = 1;
for (int j = 0; j < letters.length; j++)
{
factorialProduct *= factorial(letters[j]);
}
int result = factorial(lengthOfWord) / factorialProduct;
System.out.printf("Data set %d: %d\n",iteration,result);
}
}
答案 1 :(得分:0)
你不要使用循环范围之外的字母,也不要一起使用,所以你可能只使用了一个变量
String word;
int result;
int cases;
int lengthOfWord;
for(int iteration = 1;iteration <= cases; iteration++) {
word = br.readLine();
lengthOfWord = word.length();
result = factorial(lengthOfWord);
for (int i = 0; i < letters.length; i++) {
int divisor = lengthOfWord - word.replace(((char)((int)'A' + i)).toString(), "").length();
result /= divisor;
}
System.out.printf("Data set %d: %d\n", iteration, result);