화 웨 이 기계 시험

3245 단어 자바 연습
제목 설명
지금 우 리 는 부정 행 위 를 하 는 문답 커 뮤 니 티 의 ID 를 찾 아야 한다. 부정 행 위 는 두 가지 가 있다. 1. A 는 B 의 질문 에 대답 하고 B 는 A 의 질문 에 대답 했다.그럼 A 랑 B 는 다 컨 닝 이 야.2. 부정행위 ID 사용자 A 와 부정행위 ID 사용자 B 가 C 의 질문 에 동시에 대답 하면 C 도 부정행위 다.모든 사용자 의 ID 가 숫자 로 알려 져 있 으 며, 한 질문 에 여러 사람 이 대답 할 수 있 습 니 다.
입력 설명:
            N(N    200000),           ,         ID,          ,          ID。(ID  0-1000000   )

출력 설명:
      ID  ,                 ID。

입력 예:
3
1 1 2
2 1 1
3 2 1 2

출력 예:
3

1 2 3
제목 분석: 1. 첫 번 째 행위 의 부정 행 위 를 요구 하 는 ID 수량 을 출력 합 니 다. 두 번 째 줄 은 어 릴 때 부터 줄 마다 부정 행 위 를 하 는 ID 를 저장 하고 TreeSet (질서 있 는 집합) 을 선택 하여 부정 행 위 를 하 는 ID 를 저장 합 니 다. 2. 한 문 제 는 여러 사람 이 대답 할 수 있 습 니 다. HashSet 은 질문 에 대답 하 는 ID 를 저장 합 니 다.  첫 번 째 숫자 는 질문 자 ID, 두 번 째 숫자 는 답변 자 수, 뒤 에는 모든 답변 자의 ID 다.맵 으로 정보 저장  키 질문 자 ID    value 모든 응답자 의 ID
두 가지 부정행위 판단 규칙 을 이해 합 니 다. 1. A 는 B 의 질문 에 대답 하고 B 는 A 의 질문 에 대답 합 니 다. A 와 B 는 모두 부정행위 입 니 다. 즉, 서로 질문 에 대답 합 니 다. 2. 부정행위 사용자 A 와 B 는 C 의 질문 에 동시에 대답 합 니 다. C 도 부정행위 입 니 다. 즉, 두 개 이상 의 부정행위 사용자 가 동시에 대답 하면 질문 자 는 부정행위 본 문제 에 몇 개의 구덩이 가 있 습 니 다. 1. 질문 자 는 자신 이 제기 한 질문 에 대답 할 수 있 습 니 다.규칙 을 사용 하여 판단 할 때 판단 에 가입 하여 순환 에 빠 지지 않도록 해 야 한다. 2. 하나의 ID 가 여러 번 질문 할 수 있 으 므 로 응답 자 를 다시 합 쳐 하나의 집합 으로 만들어 야 한다.
import java.util.HashMap; import java.util.HashSet; import java.util.Scanner;  import java.util.TreeSet; public class Main {public static void main (String [] args) {Scanner scan = new Scanner (System. in); while (scan. hasNext ()) {int N = scan. nextInt (); / / 총 문제 수            scan. nextLine (); / / 줄 바 꿈 문자 건 너 뛰 기 String [] info = new String [N]; for (int i = 0; i < N; i + +) {info [i] = scan. nextLine ();} judgeCheat (info, N);} scan. close ();    } private static void judgeCheat (String [] info, int n) {/ 키 질문 자 ID    value 모든 응답 자의 ID HashMap > inforMap = new HashMap > (); / ID 어 릴 때 부터 커닝 자 TreeSet cheatTs = new TreeSet (); for (int i = 0; i < n; i + +) {String [] str = info [i]. split ("); int askId = Integer. parseInt (str [0]); / / 질문 자의 ID int answerNum = Integer. parseInt (str [1]); / / 응답자 수 / / 응답자 의 ID HashSet answerSet = new HashSet (); for (int j = 0; j < answerNum; j + +) {int answerId = Integer. parseInt (str [2 + j); answerSet. add (answerId);{/ / 그 에 대응 하 는 대답 자 ID 집합 HashSet tempaAnswerSet = infoMap. get (answerId); / / 서로 대답 하 는 지 여 부 를 판단 합 니 다. 둘 다 컨 닝 if (tempanswerSet. contains (askId) {cheatTs. add (askId); cheatTs. add (answerId);}} / endfor in            //한 ID 가 여러 번 질문 을 하면 응답자 번호 ID 를 한 집합 에 다시 통합 합 니 다 if (infoMap. containskiy (askId) {answerSet. addAll (infomap. get (askId);} / 한 줄 을 분석 하고 정 보 를 저장 합 니 다 infoMap. put (askId, answerSet);} / / endfor out / / 규칙 2 에 따라 부정 행 위 를 판단 합 니 다. 두 개 이상 의 부정 행 위 를 한 ID 가 동시에 부정 행 위 를 한 것 이 라 고 대답 합 니 다.(Integer key: infoMap. keyset () {HashSet answerIdSet = infoMap. get (key); / 자바 로 교 집합 함수 retainAll / / 같은 요소 가 존재 하면 answerIdSet 에 같은 요소 만 남아 있 습 니 다. 같은 요소 가 존재 하지 않 으 면 answerIdSet 이 비어 있 습 니 다. answerIdSet. retainAll (cheatTs); if (answerIdSet. size () > = 2) {cheatTs. add (key);} System. out. println(cheatTs.size()); for(Integer cheatId : cheatTs){ System.out.println(cheatId); } } }

좋은 웹페이지 즐겨찾기