Java 重复排序排列秩的时间限制
首先我想说的是,我不是很擅长编程。我试图解决重复排列问题,但我不明白为什么我总是有时间限制。我的代码是用java编写的,我使用BigInteger进行阶乘和其他计算 请帮我找出我有时间限制的原因。我找到了同样的方法来解决这个问题,但那是在python中。这里我提供了我的代码。提前谢谢Java 重复排序排列秩的时间限制,java,Java,首先我想说的是,我不是很擅长编程。我试图解决重复排列问题,但我不明白为什么我总是有时间限制。我的代码是用java编写的,我使用BigInteger进行阶乘和其他计算 请帮我找出我有时间限制的原因。我找到了同样的方法来解决这个问题,但那是在python中。这里我提供了我的代码。提前谢谢 import java.math.BigInteger; public class Solution { BigInteger factorial(int n){ BigInteger s
import java.math.BigInteger;
public class Solution {
BigInteger factorial(int n){
BigInteger sum=new BigInteger(String.valueOf(1));
if(n<2) return new BigInteger(String.valueOf(n));
for(int j=2;j<=n;j++){
sum=sum.multiply(new BigInteger(String.valueOf(j)));
}
return sum;
}
public int findRank(String a) {
if(a.length()<2) return 1;
Map<Character,Integer> map1=new HashMap<Character,Integer>();
BigInteger sum=new BigInteger(String.valueOf(1));
for(int i=0;i<a.length();i++){
if(!map1.containsKey(a.charAt(i))){
map1.put(a.charAt(i),1);
}
else{
int cc=map1.get(a.charAt(i));
cc=cc+1;
map1.put(a.charAt(i),cc);
}
}
BigInteger temp1=new BigInteger(String.valueOf(1));
for (Map.Entry<Character, Integer> entry : map1.entrySet())
{
temp1=temp1.multiply(new BigInteger(String.valueOf(factorial( entry.getValue()))));
}
temp1=temp1.pow(1000001);
temp1=temp1.mod(new BigInteger(String.valueOf(1000003)));
for(int i=0;i<a.length();i++){
BigInteger rank=new BigInteger(String.valueOf(0));
for(int j=i+1;j<a.length();j++){
if(a.charAt(i)>a.charAt(j)){
rank=rank.add(new BigInteger(String.valueOf(1)));
}
}
BigInteger temp=new BigInteger(String.valueOf(factorial(a.length()-i-1)));
rank=rank.multiply(temp1);
rank=rank.multiply(temp);
sum=sum.add(rank);
sum=sum.mod(new BigInteger(String.valueOf(1000003)));
}
return sum.intValue();
}
}
import java.math.biginger;
公共类解决方案{
大整数阶乘(整数n){
BigInteger总和=新的BigInteger(String.valueOf(1));
如果(n您使用了过多的字符串解析和对象创建。这一切在运行时都很昂贵
优化使用BigInteger后,该方法将在我的电脑上以~1ms的速度返回
public class Solution {
private BigInteger factorial(final int n) {
BigInteger sum = BigInteger.ONE;
if (n < 2) {
return BigInteger.valueOf(n);
}
for (int j = 2; j <= n; j++) {
sum = sum.multiply(BigInteger.valueOf(j));
}
return sum;
}
public int findRank(final String a) {
if (a.length() < 2) {
return 1;
}
final Map<Character, Integer> map1 = new HashMap<>();
BigInteger sum = BigInteger.ONE;
for (int i = 0; i < a.length(); i++) {
final char charAt = a.charAt(i);
if (!map1.containsKey(charAt)) {
map1.put(charAt, 1);
} else {
int cc = map1.get(charAt);
map1.put(charAt, cc++);
}
}
BigInteger temp1 = BigInteger.ONE;
for (final Map.Entry<Character, Integer> entry : map1.entrySet()) {
temp1 = temp1.multiply(factorial(entry.getValue()));
}
temp1 = temp1.pow(1000001);
temp1 = temp1.mod(BigInteger.valueOf(1000003));
for (int i = 0; i < a.length(); i++) {
BigInteger rank = BigInteger.ZERO;
for (int j = i + 1; j < a.length(); j++) {
if (a.charAt(i) > a.charAt(j)) {
rank = rank.add(BigInteger.ONE);
}
}
final BigInteger temp = factorial(a.length() - i - 1);
rank = rank.multiply(temp1);
rank = rank.multiply(temp);
sum = sum.add(rank);
sum = sum.mod(BigInteger.valueOf(1000003));
}
return sum.intValue();
}
}
公共类解决方案{
私有BigInteger阶乘(最终整数n){
BigInteger总和=BigInteger.1;
if(n<2){
返回BigInteger.valueOf(n);
}
对于(int j=2;j a.charAt(j)){
rank=rank.add(BigInteger.ONE);
}
}
最终BigInteger温度=阶乘(a.长度()-i-1);
秩=秩乘(temp1);
秩=秩乘(温度);
sum=sum.add(秩);
sum=sum.mod(biginger.valueOf(1000003));
}
返回sum.intValue();
}
}
谢谢你的回复,我理解,但我仍然有时间限制。我应该改变方法还是使用其他编程语言来解决这个问题!我在python中看到了相同的方法,并在何处给出了正确的答案。这里我提供了python代码的url。我如何提高代码效率。