求n位全排列字典排序后,给定序列的下一序列。
例如n=3的全排列:123,132,213,231,312,321. 给定序列213,则需要输出231
思考:按字典排序后,要输出给定序列N的下一序列,则要尽量保证前面的几位不变,变化数字的位置越靠后,则数值改变越小。
public
static
int
nextArray (
int
N
,
int
n
){
int
a
[]=
new
int
[
n
];
int
i
=0;
int
M
=0;
for
(
int
p
=
n
-1;
p
>=0;
p
--){ //将N的各位上的数字顺序存储在a[]中
int
A
=(
int
) Math.pow (10,
p
);
a
[
i
]=
N
/
A
;
N
=
N
%
A
;
i
++;
}
i
=
n
-1;
while
(
i
>0&&
M
==0){
if
(
a
[
i
]>
a
[
i
-1]){ //找到要改变数字的位置
int
k
=
i
-1;
int
temp
=
a
[
k
];
java.util.Arrays.sort(
a
,
k
,
n
); //从改变位起,小到大排序
while
(
temp
!=
a
[
k
]){
k
++;
}
temp
=
a
[
k
+1];
while
(
k
>=
i
-1){ //找到提前的数字取出,调整序列
a
[
k
+1]=
a
[
k
];
k
--;
}
a
[
i
-1]=
temp
;
int
j
=0;
for
(
i
=
n
-1;
i
>=0;
i
--){
M
=
M
+
a
[
i
]*(
int
)(Math.pow(10,
j
));
j
++;
}
}
i
--;
}
return
M
;
}
public
static
void
printArray(
int
[]
a
){
for
(
int
i
=0;
i
<
a
.length;
i
++){
System.
out
.print(
a
[
i
]+
"\t"
);
}
}
public
static
void
main(String
args
[]){
int
X
=0;
X
= nextArray(23541,5);
System.
out
.print(
"\n下一个数"
+
X
);
}
|