题目描述
使用HashMap判断重复元素,如果map的大小为1,那么说明单独奶牛获胜;如果大小为2,说明组队获胜;
但是有可能单独奶牛和组队奶牛的元素重复,那么有需要用HashMap来判重,最后输出map的大小即为单独奶牛
或者组队的数量。
算法1
(暴力枚举) $O(n^2)$
Java 代码
import java.util.*;
class Main{
//定义一个二维数组用来存储元素
public static char[][] arr = new char[3][3];
//用来存储重复的单独奶牛
public static HashMap<Character,Integer> map1 = new HashMap<>();
//用来存储重复的组队
public static HashMap<String,Integer> map2 = new HashMap<>();
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
for(int i=0;i<3;i++){
String str = scanner.nextLine();
arr[i][0] = str.charAt(0);
arr[i][1] = str.charAt(1);
arr[i][2] = str.charAt(2);
}
//看一行是否有获胜的
for(int i=0;i<arr.length;i++){
HashMap<Character,Integer> hash = new HashMap<>();
for(int j=0;j<arr[0].length;j++){
if(!hash.containsKey(arr[i][j])){
hash.put(arr[i][j],1);
}else{
hash.put(arr[i][j],hash.get(arr[i][j])+1);
}
}
if(hash.size()==1){
//说明该行全部为1个元素,单独奶牛获胜
for(Character num:hash.keySet()){
if(!map1.containsKey(num)){
map1.put(num,1);
}
}
}else if(hash.size()==2){
//组队获胜
String rs = "";
for(Character num:hash.keySet()){
if(rs.length()==0){
//没有元素
rs+=String.valueOf(num);
}else{
//有元素
char c = rs.charAt(0);
if(c<num){
rs = rs+String.valueOf(num);
}else{
rs = String.valueOf(num)+String.valueOf(c);
}
}
}
if(!map2.containsKey(rs)){
map2.put(rs,1);
}
}else{
continue;
}
}
//看一列是否有获胜的
for(int j=0;j<arr[0].length;j++){
HashMap<Character,Integer> hash = new HashMap<>();
for(int i=0;i<arr.length;i++){
if(!hash.containsKey(arr[i][j])){
hash.put(arr[i][j],1);
}else{
hash.put(arr[i][j],hash.get(arr[i][j])+1);
}
}
if(hash.size()==1){
for(Character num:hash.keySet()){
if(!map1.containsKey(num)){
map1.put(num,1);
}
}
}else if(hash.size()==2){
String rs = "";
for(Character num:hash.keySet()){
if(rs.length()==0){
//没有元素
rs+=String.valueOf(num);
}else{
//有元素
char c = rs.charAt(0);
if(c<num){
rs = rs+String.valueOf(num);
}else{
rs = String.valueOf(num)+String.valueOf(c);
}
}
}
if(!map2.containsKey(rs)){
map2.put(rs,1);
}
}else{
continue;
}
}
//看对角线是否有获胜
HashMap<Character,Integer> hash1 = new HashMap<>();
for(int i=0;i<arr.length;i++){
if(!hash1.containsKey(arr[i][i])){
hash1.put(arr[i][i],1);
}else{
hash1.put(arr[i][i],hash1.get(arr[i][i])+1);
}
}
if(hash1.size()==1){
for(Character num:hash1.keySet()){
if(!map1.containsKey(num)){
map1.put(num,1);
}
}
}
if(hash1.size()==2){
String rs = "";
for(Character num:hash1.keySet()){
if(rs.length()==0){
//没有元素
rs+=String.valueOf(num);
}else{
//有元素
char c = rs.charAt(0);
if(c<num){
rs = rs+String.valueOf(num);
}else{
rs = String.valueOf(num)+String.valueOf(c);
}
}
}
if(!map2.containsKey(rs)){
map2.put(rs,1);
}
}
HashMap<Character,Integer> hash2 = new HashMap<>();
for(int i=0;i<arr.length;i++){
if(!hash2.containsKey(arr[i][arr.length-1-i])){
hash2.put(arr[i][arr.length-1-i],1);
}else{
hash2.put(arr[i][arr.length-1-i],hash2.get(arr[i][arr.length-1-i])+1);
}
}
if(hash2.size()==1){
for(Character num:hash2.keySet()){
if(!map1.containsKey(num)){
map1.put(num,1);
}
}
}
if(hash2.size()==2){
String rs = "";
for(Character num:hash2.keySet()){
if(rs.length()==0){
//没有元素
rs+=String.valueOf(num);
}else{
//有元素
char c = rs.charAt(0);
if(c<num){
rs = rs+String.valueOf(num);
}else{
rs = String.valueOf(num)+String.valueOf(c);
}
}
}
if(!map2.containsKey(rs)){
map2.put(rs,1);
}
}
System.out.println(map1.size());
System.out.println(map2.size());
}
}