不知道有没有更好的写法

2021-04-09 00:06:50 +08:00
 LowBi

RT.个人项目上的一个问题,写了个例子,自己感觉写的方法较笨。😅

https://www.wolai.com/beCZEzzoibLdm9yfrNrDCo

ps:不过挺享受洗澡时在想代码怎么写,洗完立即把想到的写法敲出来😂

2200 次点击
所在节点    Java
8 条回复
javapythongo
2021-04-09 00:18:17 +08:00
你这个算法的时间复杂度是 O(m*n)了,而且在 if(x[i] == y[j])判定相等赋值后,应该直接 break 。
可以先遍历 y 数组,存储在一个 set 集合中,再遍历 x 数组,原地修改即可,这样子的时间复杂度是 O(m+n)
LGA1150
2021-04-09 00:19:24 +08:00
int[] x = {1,2,3,4,5,6,7};
int[] y = {2,4,7};
int[] z = Arrays.stream(x).map(e -> Arrays.binarySearch(y, e) < 0 ? 0 : e).toArray();
System.out.println(Arrays.toString(z));
需要保证 y 有序
LGA1150
2021-04-09 00:28:24 +08:00
如果像 #1 说的使用集合并原地修改:
Set<Integer> set = Arrays.stream(y).boxed().collect(Collectors.toSet());
for (int i = 0; i < x.length; i++) {
if (!set.contains(x[i])) x[i]=0;
}
不用保证 y 有序
zjp
2021-04-09 00:35:38 +08:00
不假设数组有序和不重复的情况
int[] x = {1, 2, 3, 4, 5, 6, 7};
int[] y = {2, 4, 7};
Map<Integer, Long> count = Arrays.stream(y).boxed()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
int[] z = Arrays.stream(x).boxed()
.map(e -> count.containsKey(e) && count.put(e, count.get(e) - 1) > 0 ? e : 0)
.mapToInt(Integer::intValue).toArray();
System.out.println("z = " + Arrays.toString(z));
zjp
2021-04-09 00:39:52 +08:00
@zjp 对 IntStream 不熟悉,boxed 然后 mapToInt 是多余的
LowBi
2021-04-09 09:03:42 +08:00
@javapythongo @LGA1150 @zjp 感谢大佬们提供代码思路
no1xsyzy
2021-04-09 09:26:43 +08:00
你这判断 a!=0 再 add 跟直接 z.add(a) 有什么区别(

@LGA1150 你这有序是 O(m log n),m,n>4 的话还不如集合呢……
有序的情况下最优应是仿归并排序的双指针移动
youhuo
2021-04-09 13:51:02 +08:00
来学习 学习

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/769252

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX