清楚两个集合里面相同的元素


1 /*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5
6 package removesame;
7
8 import java.util.ArrayList;
9 import java.util.List;
10
11 /**
12 *
13 * @author root
14 */
15 public class Main {
16
17 /**
18 * 此方法测试 同一集合中不能再存在重复的元素 否则无法刪除 可以先把每个集合中重复的元素先删除
19 */
20 public static void main(String[] args) {
21 // TODO code application logic here
22
23 //存放aStr和bStr集合重复元素的index
24 List<Integer> aDelIndex=new ArrayList<Integer>();
25 List<Integer> bDelIndex=new ArrayList<Integer>();
26
27
28 List<String> aStr=new ArrayList<String>();
29 List<String> bStr=new ArrayList<String>();
30
31 aStr.add("d");aStr.add("a");aStr.add("c");//aStr.add("d");
32
33 bStr.add("a");bStr.add("b");bStr.add("c");
34
35 String a="";
36 String b="";
37
38
39 //循环遍历两个几何的所有元素
40 for(int i=0;i<aStr.size();i++)
41 {
42 a=aStr.get(i);
43
44 int j=0;
45 for(;j<bStr.size();j++)
46 {
47 b=bStr.get(j);
48
49 if(a.equals(b))
50 {
51
52 System.out.println("刪除索引:i="+i+"\tj="+j);
53 //如果两个值相同,则把他们的index 放进记录重复下标的几何(aDelIndex,bDelIndex)
54 aDelIndex.add(i);
55 bDelIndex.add(j);
56
57 //不需要再比较了,退出本次比较
58 break;
59
60 }
61 }
62
63 }
64
65
66
67
68
69 /*
70 *将记录删除索引的集合里面的值 进行冒泡排序,从小到达排列,否则刪出有可能出错
71 */
72 int temp;
73 for(int i=0;i<aDelIndex.size();i++)
74 {
75 for(int j=0;j<aDelIndex.size()-i-1;j++)
76 {
77 if(aDelIndex.get(j)>aDelIndex.get(j+1))
78 {
79 temp=aDelIndex.get(j);
80 aDelIndex.set(j, aDelIndex.get(j+1));
81 aDelIndex.set(j+1,temp);
82 }
83 }
84 }
85
86
87 for(int num:aDelIndex)
88 {
89 System.out.print(num+"\t");
90 }
91
92 System.out.println();
93
94 for(int i=0;i<bDelIndex.size();i++)
95 {
96 for(int j=0;j<bDelIndex.size()-i-1;j++)
97 {
98 if(bDelIndex.get(j)>bDelIndex.get(j+1))
99 {
100 temp=bDelIndex.get(j);
101 bDelIndex.set(j, bDelIndex.get(j+1));
102 bDelIndex.set(j+1,temp);
103 }
104 }
105 }
106 for(int num:bDelIndex)
107 {
108 System.out.print(num+"\t");
109 }
110
111
112
113
114
115 int k=1;
116
117 boolean f=false;
118
119 //删除aStr中重复的元素
120
121 //第一次刪出后,因为几何的索引会全部提前一个,所以都要刪出aStr.remove(i-1)
122 for(int i:aDelIndex)
123 {
124 if(f)
125 {
126 aStr.remove(i-k);
127 k++;//第一次减一 第一次减二 ……
128 }
129 else
130 {
131 aStr.remove(i);
132 f=true;
133 }
134 }
135
136
137
138 f=false;
139
140 //重置 k
141 k=1;
142 //刪出bStr中重复的元素
143 for(int j:bDelIndex)
144 {
145 System.out.println("j:"+j);
146 if(f)
147 {
148 bStr.remove(j-k);
149 k++;
150 }
151 else
152 {
153 bStr.remove(j);
154 f=true;
155 }
156 }
157
158
159
160
161 //打印
162 System.out.println("----------------------------------------------");
163 System.out.print("aStr:");
164 for (String s:aStr) {
165 System.out.print(s+"\t");
166 }
167
168 System.out.println();
169 System.out.println("----------------------------------------------");
170 System.out.print("bStr:");
171 for (String s:bStr) {
172 System.out.print(s+"\t");
173 }
174 System.out.println();
175
176
177 }
178
179 }


感觉做的很烦,不知道有没有更好的解决办法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以采用双指针法,即分别用两个指针分别指向A和B的首元素,如果A元素小于B元素,则A的指针向后移动一位,否则,B的指针向后移动一位,以此类推,当A指针和B指针指向的元素不相等时,将其加入集合C,并移动两个指针,直到A没有元素和B没有元素。由于两个指针只会向后移动,因此算法的时间复杂度为O(|A| + |B|)。 ### 回答2: 算法步骤: 首先,创建一个空集合C用于存放不相同元素。 然后,使用两个指针i和j分别指向集合A和集合B的首个元素。 接着,比较当前指针所指的元素,将较小的元素添加到集合C,并将对应的指针向后移动一位。 如果两个指针所指的元素相同,则将两个指针都往后移动一位。 重复上述过程,直到其一个集合的指针到达尾部。 最后,将剩余集合元素全部添加到集合C。 算法分析: 在最坏情况下,需要比较集合A和集合B的所有元素,时间复杂度为O(|A| + |B|)。 因为假设A元素值不同,B元素值也不同,所以添加元素集合C的操作时间复杂度是O(1)。 因此,整个算法的时间复杂度为O(|A| + |B|)。 ### 回答3: 算法步骤: 1. 初始化两个指针i和j分别指向数组A和数组B的起始位置。 2. 创造一个空集合C用于存放不相同元素。 3. 进入循环直到指针i或者j越界: a. 如果A[i] < B[j],将A[i]加入集合C,i指针后移。 b. 如果A[i] > B[j],将B[j]加入集合C,j指针后移。 c. 如果A[i] = B[j],i和j指针都后移。 4. 当其一个指针越界后,将剩下的数组元素加入集合C。 算法分析: 该算法的时间复杂度取决于步骤3的循环次数。由于数组A和数组B都是已排序的,每次循环只需比较A[i]和B[j]的大小。假设数组A的长度为n,数组B的长度为m,则最坏情况下,循环次数为n+m。因此,该算法的时间复杂度为O(n+m)。 需要注意的是,在给定的条件下,算法的指针i和j是分别在A和B遍历的,因此时间复杂度是O(|A| |B|),即O(nm)。由于题目已明确说明A元素值不同,B元素值也不同,因此该算法是可行的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值