|
|
|
@ -0,0 +1,531 @@
|
|
|
|
|
package com.msb.test01;
|
|
|
|
|
|
|
|
|
|
import org.junit.Test;
|
|
|
|
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
public class test01 {
|
|
|
|
|
@Test
|
|
|
|
|
public void test01(){
|
|
|
|
|
/**
|
|
|
|
|
* Excel单元格数值统计(java)
|
|
|
|
|
* 题目描述:
|
|
|
|
|
* excel工作表中对选定区域的数值进行统计的功能非常实用。
|
|
|
|
|
* 仿照Excel的这个功能,请对给定表格中选定区域中的单元格进行求和统计,并输出统计结果。
|
|
|
|
|
* 为简化计算,假设当前输入中每个单元格内容仅为数字或公式两种。
|
|
|
|
|
* 如果为数字,则是一个非负整形,形如3,77
|
|
|
|
|
* 如果为公式,则固定以=开头,且仅包含下面三种情况:
|
|
|
|
|
* 1.等于某单元格的值,例如=B12
|
|
|
|
|
* 2.两个单元格的双目运算(仅为+或-),形如=C1-C2,C3+B2
|
|
|
|
|
* 3.单元格和数字的双目运算(仅为+或-),形如B1+1,100-B2
|
|
|
|
|
*
|
|
|
|
|
* 注意:
|
|
|
|
|
* 1.公式内容都是合法的,例如不存在,=C+1,=C1-C2+B3,=5,=3+5
|
|
|
|
|
* 2.不存在循环引用,例如A1=B1+C1,C1=A1+B2
|
|
|
|
|
* 3,内容中不存在空格,括号
|
|
|
|
|
*
|
|
|
|
|
* 输入描述
|
|
|
|
|
* 第一行两个整数rows cols,表示给定表格区域的行数和列数,1<=rows<=20,1<=cols<=26.
|
|
|
|
|
* 接下来rows行,每行cols个以空格分隔的字符串,表示给定表格values的单元格内容。
|
|
|
|
|
* 最后一行输入的字符串,表示给定的选中区域,形如A1:C2.
|
|
|
|
|
*
|
|
|
|
|
* 输出描述:
|
|
|
|
|
* 一个整数,表示给定选中区域各单元格中数字的累加总和,范围-2147,483,648~2147483647
|
|
|
|
|
*
|
|
|
|
|
* 备注
|
|
|
|
|
* 表格的行号1-20,列号A-Z,例如单元格B3对应value[2][1].
|
|
|
|
|
*
|
|
|
|
|
* 输入的单元格内容(含公式)中数字均为十进制,值范围[0,100].
|
|
|
|
|
* 选中区域:冒号左侧单元格表示选中区域的左上角,右侧表示右下角,如可以为B2:C10,B2:B5,B2Y2,C2:A1
|
|
|
|
|
* 的输入。
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
StringBuffer buffer = new StringBuffer();
|
|
|
|
|
String str = "abcdefgh";
|
|
|
|
|
if(str.length()<8){
|
|
|
|
|
buffer.append(str);
|
|
|
|
|
}
|
|
|
|
|
while(buffer.length()< 8 && str.length()<8){
|
|
|
|
|
buffer.append("0");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while(str.length()>8){
|
|
|
|
|
String strs =str.substring(0,8);
|
|
|
|
|
System.out.println(strs);
|
|
|
|
|
str = str.substring(8);
|
|
|
|
|
}
|
|
|
|
|
if(str.length()==8){
|
|
|
|
|
System.out.println(str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(str.length()<8 && buffer.length()<8){
|
|
|
|
|
buffer.append(str);
|
|
|
|
|
}
|
|
|
|
|
while(buffer.length()< 8 && str.length()<8 && str.length()>0){
|
|
|
|
|
buffer.append("0");
|
|
|
|
|
}
|
|
|
|
|
System.out.println(buffer.toString());
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//递归方法实现
|
|
|
|
|
public void mergeSort1(int[] arr){
|
|
|
|
|
if(arr == null || arr.length <2){
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
process(arr,0,arr.length -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void process(int[] arr,int l,int r){
|
|
|
|
|
if(l==r){
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
int mid = l + ((r -l) >>1);
|
|
|
|
|
process(arr,l,mid);
|
|
|
|
|
process(arr,mid+1,r);
|
|
|
|
|
merge(arr,l,mid,r);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void merge(int[] arr,int l,int m,int r){
|
|
|
|
|
int[] help = new int[r-l+1];
|
|
|
|
|
int i=0;
|
|
|
|
|
int p1=l;
|
|
|
|
|
int p2= m+1;
|
|
|
|
|
while(p1<=m && p2<=r){
|
|
|
|
|
help[i++] = arr[p1]<= arr[p2]? arr[p1++]:arr[p2++];
|
|
|
|
|
}
|
|
|
|
|
//要么p1越界了,要么p2越界了
|
|
|
|
|
while(p1<=m){
|
|
|
|
|
help[i++] = arr[p1++];
|
|
|
|
|
}
|
|
|
|
|
while(p2<=r){
|
|
|
|
|
help[i++]=arr[p2++];
|
|
|
|
|
}
|
|
|
|
|
for(i=0;i<help.length;i++){
|
|
|
|
|
arr[l+i] = help[i];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//当前考虑到了index号货物,index...所有的货物可以自由选择
|
|
|
|
|
//做的选择不能超过背包容量
|
|
|
|
|
//返回最大价值
|
|
|
|
|
public static int process1(int[] w,int[] v,int index,int bag){
|
|
|
|
|
if(bag < 0){
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
if(index == w.length){
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
//有货,index位置的货
|
|
|
|
|
//bag有空间
|
|
|
|
|
//不要当前的货
|
|
|
|
|
int p1 = process1(w,v,index+1,bag);
|
|
|
|
|
//要当前的货
|
|
|
|
|
int p2=0;
|
|
|
|
|
int next = process1(w,v,index+1,bag-w[index]);
|
|
|
|
|
if(next !=-1){
|
|
|
|
|
p2 = v[index] + next;
|
|
|
|
|
}
|
|
|
|
|
return Math.max(p1,p2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void test02(){
|
|
|
|
|
String str = "0101";
|
|
|
|
|
int anInt = Integer.parseInt(str, 2);
|
|
|
|
|
System.out.println(anInt);
|
|
|
|
|
TreeSet<Character> set = new TreeSet<Character>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void mergeSort2(int[] arr){
|
|
|
|
|
if(arr == null || arr.length < 2){
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
int N = arr.length;
|
|
|
|
|
//步长
|
|
|
|
|
int mergeSize = 1;
|
|
|
|
|
while(mergeSize < N){
|
|
|
|
|
// 当前左组的,第一个位置
|
|
|
|
|
int L = 0;
|
|
|
|
|
while(L < N){
|
|
|
|
|
int M = L + mergeSize -1;
|
|
|
|
|
if (M >= N) {
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
int R = Math.min(M + mergeSize,N-1);
|
|
|
|
|
merge(arr,L,M,R);
|
|
|
|
|
L = R +1;
|
|
|
|
|
}
|
|
|
|
|
//防止溢出
|
|
|
|
|
if(mergeSize > N/2){
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
mergeSize <<= 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int comparator(int[] arr){
|
|
|
|
|
if(arr == null || arr.length <2){
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
int res = 0;
|
|
|
|
|
for(int i=1;i<arr.length;i++){
|
|
|
|
|
for(int j=0;j<i;j++){
|
|
|
|
|
res += arr[j] < arr[i] ? arr[j] :0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public int smallSum(int[] arr){
|
|
|
|
|
if(arr == null || arr.length < 2){
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return process3(arr,0,arr.length - 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//arr[l,r)即要排好序,也要求小和返回
|
|
|
|
|
//所有merge时,产生的小和,累加
|
|
|
|
|
//左 排序 merge
|
|
|
|
|
//右 排序merge
|
|
|
|
|
//merge
|
|
|
|
|
|
|
|
|
|
public int process3(int[] arr,int l,int r){
|
|
|
|
|
if(l == r){
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
// l < r
|
|
|
|
|
int mid = l + ((r - l) >> 1);
|
|
|
|
|
return process3(arr,l,mid) + process3(arr,mid + 1,r) + merge3(arr,l,mid,r);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int merge3(int[] arr,int l,int m,int r){
|
|
|
|
|
int[] help = new int[r-l+1];
|
|
|
|
|
int i=0;
|
|
|
|
|
int p1 = l;
|
|
|
|
|
int p2= m+1;
|
|
|
|
|
int res =0;
|
|
|
|
|
while(p1<= m && p2 <= r){
|
|
|
|
|
res += arr[p1] < arr[p2] ? (r-p2+1) * arr[p1] :0;
|
|
|
|
|
help[i++] = arr[p1] < arr[p2] ? arr[p1++] :arr[p2++];
|
|
|
|
|
}
|
|
|
|
|
while(p1 <= m){
|
|
|
|
|
help[i++] = arr[p1++];
|
|
|
|
|
}
|
|
|
|
|
while(p2 <= r){
|
|
|
|
|
help[i++] = arr[p2++];
|
|
|
|
|
}
|
|
|
|
|
for(i=0;i<help.length;i++){
|
|
|
|
|
arr[l+i] = help[i];
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public int biggerTwice(int[] arr){
|
|
|
|
|
if(arr == null || arr.length < 2){
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return process4(arr,0,arr.length -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int process4(int[] arr,int l,int r){
|
|
|
|
|
if(l == r){
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
int mid = l+((r-l) >> 1);
|
|
|
|
|
return process4(arr,l,mid) + process4(arr,mid+1,r) +
|
|
|
|
|
merge4(arr,l,mid,r);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int merge4(int[] arr,int l,int m,int r){
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void test03(){
|
|
|
|
|
/**
|
|
|
|
|
* 返回矩阵中非1的元素个数(java)
|
|
|
|
|
* 题目描述
|
|
|
|
|
* 存在一个m*n的二维数组,其成员取值范围为0,1,2.
|
|
|
|
|
* 其中值为1的元素具备同化特性,每经过1s,将上下左右值为0的元素同化为1.
|
|
|
|
|
* 而值为2的元素,免疫同化。
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void test04(){
|
|
|
|
|
/**
|
|
|
|
|
* Linux发行版的数量(java)
|
|
|
|
|
* 题目描述
|
|
|
|
|
* Linux 操作系统有多个发行版,distrowatch.com提供了各个发行版的资料。这些发行版互相
|
|
|
|
|
* 存在关联,例如Ubuntu基于Debian开发,而Mint又基于Ubuntu开发,
|
|
|
|
|
* 那么我们认为Mint同Debian也存在关联。
|
|
|
|
|
* 发行版集是一个或多个相关存在关联的操作系统发行版,集合内不包含没有
|
|
|
|
|
* 关联的发行版。
|
|
|
|
|
* 给你一个n*n的矩阵isConnected,其中isConnected[i][j]=1
|
|
|
|
|
* 表示第i个发行版和第j个发行版直接关联,而isConnected[i][j]=0表示二者不直接相连。
|
|
|
|
|
* 返回最大的发行版集中发行版的数量。
|
|
|
|
|
* 输入描述
|
|
|
|
|
* 第一行输入发行版的总数量N,之后每行表示各发行版间是否直接相关
|
|
|
|
|
* 输出描述
|
|
|
|
|
* 输出最大的发行版集中发行版的数量
|
|
|
|
|
* 备注
|
|
|
|
|
* 1<=N<= 200
|
|
|
|
|
* 用例
|
|
|
|
|
* 输入
|
|
|
|
|
* 4
|
|
|
|
|
* 1 1 0 0
|
|
|
|
|
* 1 1 1 0
|
|
|
|
|
* 0 1 1 0
|
|
|
|
|
* 0 0 0 1
|
|
|
|
|
* 输出 3
|
|
|
|
|
* 说明Debian(1)和Unbuntu(2)相关
|
|
|
|
|
* Mint(3)和Ubuntu(2)相关,
|
|
|
|
|
* EeulerOS(4)和另外三个都不相关,
|
|
|
|
|
* 所以存在两个发行版集,发行版集中发行版的数量分别是3和1,所以输出3.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Scanner sc = new Scanner(System.in);
|
|
|
|
|
int n= sc.nextInt();
|
|
|
|
|
int[][] matrix = new int[n][n];
|
|
|
|
|
for(int i=0;i<n;i++){
|
|
|
|
|
for(int j=0;j< n;j++){
|
|
|
|
|
matrix[i][j] = sc.nextInt();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
System.out.println(getResult(matrix,n));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public int getResult(int[][] matrix,int n){
|
|
|
|
|
UnionFindSet ufs = new UnionFindSet(n);
|
|
|
|
|
for(int i=0;i<n;i++){
|
|
|
|
|
for(int j=i+1;j<n;j++){
|
|
|
|
|
// j从i+1开始,是因为矩阵是对称的
|
|
|
|
|
if(matrix[i][j] == 1){
|
|
|
|
|
ufs.union(i,j);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// conncted的key代表某个连通分量的顶级父节点,value
|
|
|
|
|
//代表该连通分量下的节点个数
|
|
|
|
|
|
|
|
|
|
HashMap<Integer,Integer> connected = new HashMap<>();
|
|
|
|
|
for(int i=0;i<n;i++){
|
|
|
|
|
Integer fa = ufs.find(ufs.fa[i]);
|
|
|
|
|
connected.put(fa,connected.getOrDefault(fa,0)+1);
|
|
|
|
|
}
|
|
|
|
|
//返回最大节点数
|
|
|
|
|
return connected.values().stream().max((a,b)-> a-b).get();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void test05(){
|
|
|
|
|
/**
|
|
|
|
|
* 不开心的小朋友(java)
|
|
|
|
|
* 题目描述
|
|
|
|
|
* 游戏场里增加了一批摇摇车,非常受小朋友欢迎,但是每辆
|
|
|
|
|
* 摇摇车同时只能有一个小朋友使用,如果没有空余的摇摇车,
|
|
|
|
|
* 需要排队等侯,或者直接离开,最后没有玩上的小朋友会非常不开心。
|
|
|
|
|
* 请根据今天小朋友的来去情况,统计不开心的小朋友数量。
|
|
|
|
|
* 1.摇摇车数量为N,范围是:1<=n<10;
|
|
|
|
|
* 2.每个小朋友都对应一个编码,编码是不重复的数学,今天小朋友的来去情况,可以使用编码表示为:
|
|
|
|
|
* 1 1 2 3 2 3.(若小朋友离去之前有空闲的摇摇车,则代表玩耍后离开;不考虑小朋友多次玩的情况)。小朋友
|
|
|
|
|
* 数量<=100
|
|
|
|
|
* 3.题目保证所有输入数据无异常且范围满足上述说明。
|
|
|
|
|
*
|
|
|
|
|
* 输入描述
|
|
|
|
|
* 第一行:摇摇车数量
|
|
|
|
|
* 第二行:小朋友来去情况
|
|
|
|
|
* 输出描述
|
|
|
|
|
* 返回不开心的小朋友数量
|
|
|
|
|
* 用例
|
|
|
|
|
* 输入 1
|
|
|
|
|
* 1 2 1 2
|
|
|
|
|
* 输出 0
|
|
|
|
|
* 说明第一行,1个摇摇车
|
|
|
|
|
* 第二行,1号来,2号来(排队)1号走2号走(1号走后摇摇车已有空闲,所以玩后离开)
|
|
|
|
|
*
|
|
|
|
|
* 输入 1
|
|
|
|
|
* 1 2 2 3 1 3
|
|
|
|
|
* 输出1
|
|
|
|
|
* 说明 第一行,1个摇摇车
|
|
|
|
|
* 第二行,1号来2号来(排队)2号走(不开心离开)
|
|
|
|
|
* 3号来(排队)1号走3号走(1号走后摇摇车已有空闲,所以
|
|
|
|
|
* 玩后离开)
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Scanner sc = new Scanner(System.in);
|
|
|
|
|
int n = Integer.parseInt(sc.nextLine());
|
|
|
|
|
String[] kids = sc.nextLine().split(" ");
|
|
|
|
|
System.out.println(getResult1(n,kids));
|
|
|
|
|
}
|
|
|
|
|
public int getResult1(int n,String[] kids){
|
|
|
|
|
//不开心的小朋友数量
|
|
|
|
|
int unHappy = 0;
|
|
|
|
|
//已在摇摇车上的小朋友编号
|
|
|
|
|
HashSet<String> playing = new HashSet<>();
|
|
|
|
|
//正在排队的小朋友编号
|
|
|
|
|
LinkedList<String> waiting = new LinkedList<>();
|
|
|
|
|
|
|
|
|
|
for(String kid : kids){
|
|
|
|
|
if(playing.contains(kid)){
|
|
|
|
|
//如果kid是摇摇车上的小朋友编号,则代表kid玩好了要离开
|
|
|
|
|
playing.remove(kid);
|
|
|
|
|
//如果kid离开后,摇摇车有空位了,如果此时有人排队,则让排队的人上车玩
|
|
|
|
|
if(waiting.size() > 0){
|
|
|
|
|
playing.add(waiting.removeFirst());
|
|
|
|
|
}
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//如果kid不是摇摇车上的小朋友,则检查id是不是排队的小朋友
|
|
|
|
|
int index = waiting.indexOf(kid);
|
|
|
|
|
if(index != -1){
|
|
|
|
|
// 如果是排队的小朋友。则说明kid没有玩到摇摇车,因此会不开心的离开
|
|
|
|
|
unHappy++;
|
|
|
|
|
waiting.remove(index);
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//如果kid既不是摇摇车上的小朋友,也不是排队的小朋友,则是
|
|
|
|
|
//新来的小朋友
|
|
|
|
|
if(playing.size() < n){
|
|
|
|
|
//如果摇摇车还有空位,则直接玩
|
|
|
|
|
playing.add(kid);
|
|
|
|
|
}else{
|
|
|
|
|
//如果摇摇车没有空位了,则需要排队
|
|
|
|
|
waiting.add(kid);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return unHappy;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
public void test06(){
|
|
|
|
|
/**
|
|
|
|
|
* 猜字谜(java)
|
|
|
|
|
* 题目描述
|
|
|
|
|
* 小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如nesw,
|
|
|
|
|
* 玩家需要猜出谜底库中正确的单词。猜中的要求如下:
|
|
|
|
|
* 对于某个谜面和谜底单词,满足下面任一条件都表示猜中:
|
|
|
|
|
* 变换顺序以后一样的,比如通过变换w和e的顺序,“nwes"跟"news”是可以
|
|
|
|
|
* 完全对应的;
|
|
|
|
|
* 字母去重以后是一样的,比如"woood"和"wood"是一样的,
|
|
|
|
|
* 它们去重后都是"wod"
|
|
|
|
|
* 请你写一个程序帮忙在谜底库中找到正确的谜底。谜面是多个单词,都需要找到对应的谜底,如果找不到的话,返回"not found"
|
|
|
|
|
* 输入描述
|
|
|
|
|
* 1.谜面单词列表,以","分隔
|
|
|
|
|
* 2.谜底库单词列表,以","分隔
|
|
|
|
|
* 输出描述
|
|
|
|
|
* 匹配到的正确单词列表,以","分隔
|
|
|
|
|
* 如果找不到,返回“not found"
|
|
|
|
|
* 备注
|
|
|
|
|
* 单词的数量N的范围:0<n<1000
|
|
|
|
|
* 词汇表的数量M的范围:0<M<1000
|
|
|
|
|
* 单词的长度P的范围:0<P<20
|
|
|
|
|
* 输入的字符只有小写英文字母,没有其他字符
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
* 用例
|
|
|
|
|
* 输入 conection
|
|
|
|
|
* connection ,today
|
|
|
|
|
* 输出connection
|
|
|
|
|
* 说明无
|
|
|
|
|
*
|
|
|
|
|
* 输入 bdni,woood
|
|
|
|
|
* bind,wrong,wood
|
|
|
|
|
* 输出 bind,wood
|
|
|
|
|
* 说明无
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Scanner sc = new Scanner(System.in);
|
|
|
|
|
String[] issues = sc.nextLine().split(",");
|
|
|
|
|
String[] answers = sc.nextLine().split(",");
|
|
|
|
|
System.out.println(getResult6(issues,answers));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public String getResult6(String[] issues,String[] answers){
|
|
|
|
|
ArrayList<String> ans = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
for(String issue:issues){
|
|
|
|
|
String str1 = getSortAndDistinctStr(issue);
|
|
|
|
|
boolean find = false;
|
|
|
|
|
for(String answer: answers){
|
|
|
|
|
String str2 = getSortAndDistinctStr(answer);
|
|
|
|
|
if(str1.equals(str2)){
|
|
|
|
|
ans.add(answer);
|
|
|
|
|
find = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(!find){
|
|
|
|
|
ans.add("not found");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
StringJoiner sj = new StringJoiner(",","","");
|
|
|
|
|
for(String an:ans){
|
|
|
|
|
sj.add(an);
|
|
|
|
|
}
|
|
|
|
|
return sj.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public String getSortAndDistinctStr(String str){
|
|
|
|
|
TreeSet<Character> set = new TreeSet<>();
|
|
|
|
|
for(char c:str.toCharArray()){
|
|
|
|
|
set.add(c);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
return set.toString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//并查集实现
|
|
|
|
|
class UnionFindSet{
|
|
|
|
|
int[] fa;
|
|
|
|
|
int count;
|
|
|
|
|
public UnionFindSet(int n){
|
|
|
|
|
this.count = n;
|
|
|
|
|
this.fa = new int[n];
|
|
|
|
|
for(int i=0;i<n;i++){
|
|
|
|
|
this.fa[i] =i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
public int find(int x){
|
|
|
|
|
if(x != this.fa[x]){
|
|
|
|
|
return (this.fa[x] = this.find(this.fa[x]));
|
|
|
|
|
}
|
|
|
|
|
return x;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void union(int x,int y){
|
|
|
|
|
int x_fa = this.find(x);
|
|
|
|
|
int y_fa = this.find(y);
|
|
|
|
|
if(x_fa != y_fa){
|
|
|
|
|
this.fa[y_fa] = x_fa;
|
|
|
|
|
this.count--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|