招行信用卡中心笔试
遇到过最友好的笔试了,分享代码攒人品。
第一题:输入一组边长,在优先组成正方形的前提下,求问可以组成正方形和长方形个数各为多少。比如[1,1,1,1,2,2,4,4]可以组成一个正方形和一个长方形
笔试的时候想不起来矩形英语了。。
package xinyongka;
import java.util.*;
public class First {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int times=in.nextInt();
for(int i=0;i<times;i++) {
int n=in.nextInt();
Map<Integer, Integer> map=new HashMap<Integer, Integer>();
List<Integer> list=new ArrayList<Integer>();
for(int k=0;k<n;k++) {
int temp=in.nextInt();
//map统计边出现次数,list存放边种类
if(map.containsKey(temp)) {
int count=map.get(temp);
count++;
map.put(temp, count);
}else {
map.put(temp, 1);
list.add(temp);
}
}
//以上都是输入统计
int square=0;//正方形
int ju=0;//矩形
for(int j=0;j<list.size();j++) {
int k=list.get(i);
if(map.get(k)>4) {
int num=map.get(k);
square=square+num/4;
map.put(k, num%4);
}
if(map.get(k)>2) {
int num=map.get(k);
ju=ju+num/2;
//map.put(k, num%2);
}
}
System.out.println(square +" "+ju/2);
}
}
} 第二题核心代码:输入一个数组,是否可以通过数组内数据交换位置使其符合a[i]%2==i%2,i从1开始。如果可以输出交换次数,不可以则输出-1。 public static int countExchTimes(int[] input) {
int n=input.length;
if(n==0) return -1;
if(n==1) {
if(input[0]%2==1) return 0;
else return -1;
}
int count1=0,count2=0;//统计奇数位和偶数位不符合要求的数字个数
for(int i=0;i<n;i++) {
if(i%2==1 && input[i]%2==0) count1++;
if(i%2==0 && input[i]%2==1) count2++;
}
if(count1!=count2) return -1;
else return count1;
} 

