用lua求两个数组的交集、并集和补集。
-- 克隆
function Clone(object)
local lookup_table = { }
local function _copy(object)
if type(object) ~= "table" then
return object
elseif lookup_table[object] then
return lookup_table[object]
end
local new_table = { }
lookup_table[object] = new_table
for key, value in pairs(object) do
new_table[_copy(key)] = _copy(value)
end
return setmetatable(new_table, getmetatable(object))
end
return _copy(object)
end -- 合并
function Merge(...)
local arrays = { ... }
local result = {}
for _,array in ipairs(arrays) do
for _, v in ipairs(array) do
table.insert(result, v)
end
end return result
end -- 交集
function Intersection(t1, t2)
local ret = {}
for k, v1 in pairs(t1) do
local equal = false
for k, v2 in pairs(t2) do
if v1 == v2 then
equal = true
break
end
end
if equal then
table.insert(ret, v1)
end
end
return ret
end -- 补集
function Complement(t1, t2)
-- 在这个函数调用多次并且是同一个数组时, 如果不写标号1这行, 下边标号2和标号3的元素移除会对传过来的数组有污染。
local t1, t2 = Clone(t1), Clone(t2) -- 标号1
for i = #t1, , - do
for j = #t2, , - do
if t1[i] == t2[j] then
table.remove(t1, i) -- 标号2
table.remove(t2, j) -- 标号3
end
end
end if #t1 ~= then
return t1
else
return t2
end
end -- 并集
function Aggregate(t1, t2)
local ret = Merge(t1, t2)
local t = {}
for _, v1 in pairs(ret) do
local exist = false
for _, v2 in pairs(t) do
if v1 == v2 then
exist = true
end
end
if not exist then
table.insert(t, v1)
end
end
return t
end local t1 = {, , , , , }
local t2 = {, , , }
local t3 = {, , , } -- 补集专用 -- 并集
print("-------------并集--------------")
local agg = Aggregate(t1, t2)
for k,v in pairs(agg) do
print(k,v)
end print("-------------分割线--------------")
print("") -- 补集
print("-------------补集--------------")
local com = Complement(t1, t3)
for k,v in pairs(com) do
print(k,v)
end print("-------------分割线--------------")
print("") -- 交集
print("-------------交集--------------")
local inter = Intersection(t1, t2)
for k,v in pairs(inter) do
print(k,v)
end
用lua求两个数组的交集、并集和补集。的更多相关文章
- java用最少循环求两个数组的交集、差集、并集
import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List ...
- java使用bitmap求两个数组的交集
一般来说int代表一个数字,但是如果利用每一个位 ,则可以表示32个数字 ,在数据量极大的情况下可以显著的减轻内存的负担.我们就以int为例构造一个bitmap,并使用其来解决一个简单的问题:求两个数 ...
- js取两个数组的交集|差集|并集|补集|去重示例代码
http://www.jb51.net/article/40385.htm 代码如下: /** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一 ...
- leetcode-350-Intersection of Two Arrays II(求两个数组的交集)
题目描述: Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, ...
- (C#) 求两个数组的交集
基本上在面试的时候,会具体到两个int数组,或string数组.具体也就是讨论算法. 首先需要的是和面试的人确认题目的含义,并非直接答题. 然后,可以提出自己的想法,首先最快的是用linq { Lis ...
- js求两个数组的交集|并集|差集|去重
let a = [1,2,3], b= [2, 4, 5]; 1.差集 (a-b 差集:属于a但不属于b的集合) a-b = [1,3] (b-a 差集:属于b但不属于a的集合) b-a = [4 ...
- 求两个集合的交集和并集C#
我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...
- VBA/Excel-实例系列-04-求两个数组的交集
原创: Z Excel高效办公之VBA 2017-03-10 Part 1:逻辑过程 已有两个数组,要求单个数组中信息无重复 以最短的数组作为循环,分别判断该数组中的元素是否在另一个数组中 如果某一元 ...
- LeetCode初级算法之数组:350 两个数组的交集 II
两个数组的交集 II 题目地址:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/ 给定两个数组,编写一个函数来计算它们的交 ...
随机推荐
- Johnson算法:多源最短路算法
Johnson算法 请不要轻易点击标题 一个可以在有负边的图上使用的多源最短路算法 时间复杂度\(O(n \cdot m \cdot log \ m+n \cdot m)\) 空间复杂度\(O(n+m ...
- Linux搜索所有文件中的内容
主要命令如下: grep -rn "{填写关键字}" * : 表示当前目录所有文件,也可以是某个文件名-r 是递归查找-n 是显示行号-R 查找所有文件包含子目录-i 忽略大小写- ...
- java并发编程(一)线程状态 & 线程中断 & 线程间的协作
参考文章: Java线程的5种状态及切换:http://blog.csdn.net/pange1991/article/details/53860651 线程的5种状态: 1. 新建(NEW):新创建 ...
- 【Gamma】Scrum Meeting 2
目录 写在前面 进度情况 任务进度表 Gamma阶段燃尽图 遇到的困难 照片 写在前面 例会时间:5.26 22:30-23:00 例会地点:微信群语音通话 代码进度记录github在这里 临近期末, ...
- DNS技术和NAT技术详解
DNS技术和NAT技术详解一.DNS(Domain Name System)1.什么是DNS2. 了解域名3.域名解析过程4.使用dig工具分析DNS过程5.浏览器输入URL后发生什么事?二.ICMP ...
- ==和Equal()
1.a==null与 null==a null放在前面就是为了避免变量为空时 引了空指针异常 如: if(a==null) 如果a 真为空时,现在就相当用调用了变量a的方法,a 都为空了还调用他的方法 ...
- x3d
目录 3d format introduction x3d resources open source C++ implementations file formats 1. Feature matr ...
- ASP.NET Core中的Startup
原文:链接 Startup.cs的作用: 配置各服务和HTTP请求管道. Startup类: ASP.NET Core中使用按惯例Startup命名的类Startup.cs: (可选)包括Config ...
- openwrt的shell下如何访问寄存器的内容?
答:通过devmem工具(在openwrt的make menuconfig中可以使能该工具) $ busybox devmem 0x123456
- vue---父子组件之间的通信【props,$refs、$emit】
在用vue进行项目开发的时候,父子组件之间的通信是经常被用到的,下面就来具体说说父子组件通信的三种方式: 父组件: <template> <div> <h1>我是父 ...