解题思路:
不管你妹的怎么变,老子都要把你变成能变成的旋转的最小值。然后写一个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我是狗。
全部评论
(1) 回帖