问题描述
public static int desc(int number) {
// Time complexity = 2n+n2
// space complexity = ?
int i,j,temp;
int array[] = new int[Integer.toString(number).length()];
for (i = 0; i < array.length; i++)
array[i] = Integer.toString(number).charat(i) - '0';
for (i = 0; i < array.length - 1; i++) {
for (j = 0; j < array.length - i - 1; j++) {
if (array[j] < array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
StringBuilder strNum = new StringBuilder();
for (int k : array) {
strNum.append(k);
}
int finalInt = Integer.parseInt(strNum.toString());
System.out.println(finalInt);
return finalInt;
}
这是我的代码,根据我的理解我能够计算时间复杂度请建议时间复杂度是否正确,并帮助我计算这个程序的空间复杂度我有点对如何计算空间复杂度感到困惑。
解决方法
首先让我们优化您的代码:
int array[] = new int[Integer.toString(number).length()];
for (i = 0; i < array.length; i++)
array[i] = Integer.toString(number).charAt(i) - '0';
到:
String to_number = Integer.toString(number);
int array[] = new int[to_number.length()];
for (i = 0; i < array.length; i++)
array[i] = to_number.charAt(i) - '0';
无需多次调用 Integer.toString(number)
。
作为 N
参数中的位数number(即 Integer.toString(number).length()
)时间复杂度可以计算如下:
String to_number = Integer.toString(number);
具有 N
的时间复杂度,对于:
for (i = 0; i < array.length; i++)
array[i] = to_number.charAt(i) - '0';
后续双循环:
for (i = 0; i < array.length - 1; i++) {
for (j = 0; j < array.length - i - 1; j++) {
if (array[j] < array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
是一个 well-know for being N(N-1)/2
,可以简化为 O(N^2)
的时间复杂度。下一个循环
for (int k : array) {
strNum.append(k);
}
的时间复杂度为 N
。最后,
int finalInt = Integer.parseInt(strNum.toString());
也是 N
。所以时间复杂度是N+N+N^2+N+N,简化为O(N^2)
时间复杂度,也称为二次时间复杂度。
现在让我们看看空间复杂度:
int array[] = new int[Integer.toString(number).length()];
在本例中为 N
和
for (int k : array) {
strNum.append(k);
}
也是N
,所以空间复杂度是2N
,简化为O(N)
。