阿里云开发者社区在线编程86.完美排列
微wx笑
2020-07-14【算法】
6
0关键字:
阿里云 开发者社区 在线编程 完美排列
完美排列概述:完美排列的定义为一个长度为n的数组,n个元素各不相同且每个元素均在[1,n]的范围内。现在给你长度为n的数组,你每次可以进行如下操作:任选数组中的一个元素,将其加一
完美排列
概述:
完美排列的定义为一个长度为n的数组,n个元素各不相同且每个元素均在[1,n]的范围内。
现在给你长度为n的数组,你每次可以进行如下操作:任选数组中的一个元素,将其加一或者减一,问最少需要多少次操作才能够使得该数组为一个完美排列。
输入一个整数n,表示数组的长度(1 <= n <= 10^4);
再输入含有n个数的数组,第i个数表示数组中的第i个元素为ai(1 <= ai <= 10^5)。
输出一个整数表示将该数组变成一个完美排列的最少操作次数。
示例1
输入: 2 [3,0] 输出: 2
注意
3->2
0->1
总共需要操作两次
示例2
输入: 81 [34,80,53,52,51,65,77,15,28,100,87,65,66,66,49,92,31,8,10,24,84,47,91,63,75,76,76,99,70,99,85,56,28,17,30,64,79,16,54,28,70,26,87,21,31,13,1,11,43,98,98,28,33,23,100,56,36,34,81,36,45,63,71,72,81,53,78,13,63,94,23,67,32,20,18,80,6,18,87,2,91] 输出: 816
什么是完美排列?
完美排列的定义为一个长度为n的数组,n个元素各不相同且每个元素均在[1,n]的范围内。
我的理解就是给你3个数,完美排列的结果就是[1,2,3]或者[3,2.1]。
正确解答
package solution86;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Arrays;
import com.weixiao.roundtable.frame.IOHelper;
public class Solution {
public static int solution(int n, int[] a) {
int count = 0;
Arrays.sort(a);//先对数组进行排序,得到升序的数组,例如[1,2,3,4,5]
//处理第一个元素
if (a[0] != 1){
count = a[0] -1;
a[0] = 1;
}
for(int i=0;i<a.length-1;i++){
int d = a[i+1] - a[i];
if (d > 1){ //比如:a[i+1] =5,a[i] = 3,中间差一个4
a[i+1] -= d - 1;
count += d - 1;
}else if (d < 1){
a[i+1] += Math.abs(d)+1;
count += Math.abs(d)+1;
}
}
return count;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = new int[]{34,80,53,52,51,65,77,15,28,100,87,65,66,66,49,92,31,8,10,24,84,47,91,63,75,76,76,99,70,99,85,56,28,17,30,64,79,16,54,28,70,26,87,21,31,13,1,11,43,98,98,28,33,23,100,56,36,34,81,36,45,63,71,72,81,53,78,13,63,94,23,67,32,20,18,80,6,18,87,2,91};
int count = 0;
count = solution(81, a);
System.out.println("count===" + count);
//有时候数组太大,所以只能放到文件中
BufferedReader br = IOHelper.getBufferedReader("D:/Workspaces_aliyun/test.txt");
String str = "";
try {
str = br.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String[] sa = str.split(",");
if (sa.length > 0){
a = new int[sa.length];
for (int i=0;i<sa.length; i++){
a[i] = Integer.valueOf(sa[i]);
}
}
count = solution(14846, a);
System.out.println("count===" + count);
}
}本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/blog/algorithm/2020-07-14/507.html



