和前脸天一样,这也是一道网易校招题,但为觉得,这道题更关键的一点是让我学会了怎么给随机数组排序并且判断是否为等差数组
突然间发现,Set的查重去重功能真是一个好东西,可以省掉好多的步骤。
下面附上网易的那道校招题题目:
如果一个数列S满足对于所有的合法的i,都有S[i + 1] = S[i] + d, 这里的d也可以是负数和零,我们就称数列S为等差数列。
小易现在有一个长度为n的数列x,小易想把x变为一个等差数列。小易允许在数列上做交换任意两个位置的数值的操作,并且交换操作允许交换多次。但是有些数列通过交换还是不能变成等差数列,小易需要判别一个数列是否能通过交换操作变成等差数列
附上我的解决代码:
package demo;
import java.util.Scanner;
import java.util.TreeSet;
public class Demo4 {
public staticvoid main(String[] args) {
// TODO Auto-generated method stub
// 获取控制台的输入
Scanner sc = new Scanner(System.in);
String str = sc.nextLine().toString();
int a[] = new int[str.length()];
for (intb = 0; b < str.length();b++) {
// 逐个获取字符串中的字符
charc = str.charAt(b);
// 字符数字-字符0就是实际的数字值,赋值给数字数组
a[b] = (int) (c -'0');
}
// 将数组中的数字按从小到大排列
int temp = 0;
for (intc = 0; c < str.length();c++) {
for (intd = 0; d < str.length();d++) {
if (a[c] >a[d]) {
temp =a[c];
a[c] =a[d];
a[d] =temp;
}
}
}
// 创建一个Set,因为Set又一个查重去重的特性,所以将每两个相邻数字相减后的值放入Set中
TreeSet<Integer> ts =new TreeSet<Integer>();
int b = 0;
for (intz = 0; z < a.length - 1;z++) {
b = a[z + 1] - a[z];
ts.add(b);
}
// 判断Set数组里是否只有一个值,若是则是等差数组,反之同理
if (ts.size() == 1) {
System.out.println("possible");
} else {
System.out.println("impossible");
}
}
}
当然,我这个方法肯定不是最简便的那种,希望有更简便方法的大佬能指点一二。