拼多多第二题
解题思路:
不管你妹的怎么变,老子都要把你变成能变成的旋转的最小值。然后写一个hashmap,key是变化后的最小值,value是出现的次数。
重点:
旋转变化,怎么旋转的我是没有搞懂,就看出一个规律,两个一队共分三对。如果队位置不变,队内顺序变化,就找另一个队来进行同样的队内交换。如果队位置改变,那个跟这个队进行交换的队,这两个中选一个队交换队内顺序。
使用递归来进行排序,首先找到最小的值,将他放到没排好位置的首位,然后做对应的旋转。然后将排序好的个数加2继续排序,直到前两个小队都拍好,就结束排序。
基本没毛病了,来展示才艺。
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
while (scanner.hasNextInt()) {// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
Map<String,Integer> hashMap=new HashMap<>();
int n = scanner.nextInt();
for (int i=0;i<n;i++){
int [] a=new int[6];
for (int j=0;j<6;j++){
a[j]=scanner.nextInt();
}
swap(a,0);
String s = Arrays.toString(a);
if (hashMap.containsKey(s)){
Integer integer = hashMap.get(s);
hashMap.put(s,integer+1);
}else {
hashMap.put(s,1);
}
}
System.out.println(hashMap.size());
Collection<Integer> values = hashMap.values();
int []a=new int[values.size()];
int k=0;
for (Integer value : values) {
a[k++]=value;
}
Arrays.sort(a);
for (int i=a.length-1;i>=0;i--){
if (i==0){
System.out.print(a[i]);
}else {
System.out.print(a[i] + " ");
}
}
System.out.println();
}
}
private static void swap(int[] a,int left) {
if (left<4) {
int index = 0;
int min=Integer.MAX_VALUE;
for (int i = left; i <6; i++) {
if (a[i] <min) {
min=a[i];
index = i;
}
}
if (index==left){
} else if (index-left==1){
int tmp=a[left];
a[left]=a[index];
a[index]=tmp;
tmp=a[4];
a[4]=a[5];
a[5]=tmp;
} else if (index%2==0){
//直接反转不用变形
int tmp=a[left];
int tmp2=a[left+1];
a[left]=a[index];
a[left+1]=a[index+1];
a[index]=tmp2;
a[index+1]=tmp;
}else {
int tmp=a[left];
int tmp2=a[left+1];
a[left]=a[index];
a[left+1]=a[index-1];
a[index-1]=tmp;
a[index]=tmp2;
}
swap(a,left+2);
}
} 感言,写了一个小时,最后没时间进行测试,输出的结果写的升序排序都没看出来,难受已经不能形容我现在的感受了。
总结:下次再投pdd我是狗。
#笔试题目##拼多多#