每周一练 之 数据结构与算法(Set)
这是第四周的练习题,五一放假结束,该收拾好状态啦。
下面是之前分享的链接:
本周练习内容:数据结构与算法 —— Set
这些都是数据结构与算法,一部分方法是团队其他成员实现的,一部分我自己做的,有什么其他实现方法或错误,欢迎各位大佬指点,感谢。
一、集合是什么?与它相关数学概念有哪些
解题:
1.集合定义:
集合(Set)是一种包含不同元素的数据结构。集合中的元素称为成员,集合最重要的两个特点:
- 集合中的成员是无序;
- 集合中不存在相同成员;
即:无序且唯一。
2.集合相关的数学概念:
集合的概念,如数学中一个由大于或等于0的整数组成的自然数集合, N = { 0, 1, 2, ...}
。
还有如空集,表示不包含任何元素的集合。
并且也有并集,交集,差集等操作。
二、请实现一个集合,并实现以下方法
add(value)
:向集合添加一个新的项。
delete(value)
:从集合移除一个值。
has(value)
:如果值在集合中,返回 true,否则返回 false。
clear()
:移除集合中的所有项。
size()
:返回集合所包含元素的数量。与数组的 length 属性类似。
values()
:返回一个包含集合中所有值的数组。
解题:
class Sets {
constructor(){
this.items = {}
}
has(value){
// return value in this.items
return this.items.hasOwnProperty(value)
}
add(value){
if(!this.has(value)) {
this.items[value] = value
return true
}
return false
}
delete(value){
if(!this.has(value)){
delete this.items[value]
return true
}
return false
}
clear(){
this.items = {}
}
size(){
const values = this.values()
return values.length
}
values(){
return Object.keys(this.items)
}
}
三、请实现集合的并集、交集、差集、子集操作
- 并集(union):对于给定的两个集合,返回一个包含两个集合中所有元素的新集合。
- 交集(intersection):对于给定的两个集合,返回一个包含两个集合中共用元素的新集合。
- 差集(difference):对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合。
- 子集(subset):验证一个给定集合是否是另一个集合的子集。
解题:
/**
* union 并集
* @param {Object} otherSet 其他集合
*/
Sets.prototype.union = function(otherSet){
let result = new Sets(),
current = this.values(),
other = otherSet.values()
for(let i = 0; i < current.length; i++){
result.add(current[i])
}
for(let i = 0; i < other.length; i++){
result.add(other[i])
}
return result
}
/**
* intersection 交集
* @param {Object} otherSet 其他集合
*/
Sets.prototype.intersection = function(otherSet){
let result = new Sets(),
current = this.values()
for(let i = 0; i < current.length; i++){
if(otherSet.has(current[i])){
result.add(current[i])
}
}
return result
}
/**
* difference 差集
* @param {Object} otherSet 其他集合
*/
Sets.prototype.difference = function(otherSet){
let result = new Sets(),
current = this.values()
for(let i = 0; i < current.length; i++){
if(!otherSet.has(current[i])){
result.add(current[i])
}
}
return result
}
/**
* subset 子集
* @param {Object} otherSet 其他集合
*/
Sets.prototype.subset = function(otherSet){
let result = new Sets(),
current = this.values()
if(this.size() > otherSet.size()) return false
for(let i = 0; i < current.length; i++){
if(!otherSet.has(current[i])){
return false
}
}
return true
}
四、给定两个数组,编写一个 intersection() 函数来计算它们的交集
使用示例如下:
const nums1 = [1, 2, 2, 1];
const nums2 = [2, 2];
const nums3 = [4, 9, 5];
const nums4 = [9, 4, 9, 8, 4];
intersection(nums1, nums2); // [2]
intersection(nums3, nums4); // [9, 4]
提示:输出结果中的每个元素是唯一的,可以不考虑输出结果的顺序。
解题:
function intersection(arr1, arr2){
if(!Array.isArray(arr1) || !Array.isArray(arr2)) return []
let create = function(arr){
let sets = new Sets()
arr.map(item => sets.add(item))
return sets
}
let Sets1 = create(arr1)
let Sets2 = create(arr2)
let result = Sets1.intersection(Sets2)
return result.values()
}
五、给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集
使用示例如下:
const nums = [1, 2, 3];
subsets(nums);
// 输出以下结果:
[
[3],
[1],
[2],
[1, 2, 3],
[1, 3],
[2, 3],
[1, 2],
[]
]
解题:
目前网络上的最优解:
function subsets(nums){
if(!nums || !Array.isArray(nums)) return []
function diff (num, vec) {
let tmp = vec.slice(0)
result.push(tmp)
for (let i = num; i < len; i++) {
vec.push(nums[i])
diff(i + 1, vec)
vec.splice(-1)
}
}
const len = nums.length
let arr = [], result = []
diff(0, arr)
return result
}
穷举法:
function subsets(nums){
if(!nums || !Array.isArray(nums)) return []
let result = [[]],
len = nums.length
if(len === 0) return result
for(let i = 0; i < len; i++){
let l = result.length
let num = nums[i]
let array = [num]
for(let j = 0; j < l; j++){
let tmparray = result[j].concat(array)
result.push(tmparray)
}
}
return result
}
下周预告
下周将练习Dictionary 和 HashTable 的题目。
每周一练 之 数据结构与算法(Set)的更多相关文章
- 每周一练 之 数据结构与算法(LinkedList)
这是第三周的练习题,原本应该先发第二周的,因为周末的时候,我的母亲大人来看望她的宝贝儿子,哈哈,我得带她看看厦门这座美丽的城市呀. 这两天我抓紧整理下第二周的题目和答案,下面我把之前的也列出来: 1. ...
- 每周一练 之 数据结构与算法(Queue)
这是第二周的练习题,这里补充下咯,五一节马上就要到了,自己的计划先安排上了,开发一个有趣的玩意儿. 下面是之前分享的链接: 1.每周一练 之 数据结构与算法(Stack) 2.每周一练 之 数据结构与 ...
- 每周一练 之 数据结构与算法(Tree)
这是第六周的练习题,最近加班比较多,上周主要完成一篇 GraphQL入门教程 ,有兴趣的小伙伴可以看下哈. 下面是之前分享的链接: 1.每周一练 之 数据结构与算法(Stack) 2.每周一练 之 数 ...
- 每周一练 之 数据结构与算法(Dictionary 和 HashTable)
这是第五周的练习题,上周忘记发啦,这周是复习 Dictionary 和 HashTable. 下面是之前分享的链接: 1.每周一练 之 数据结构与算法(Stack) 2.每周一练 之 数据结构与算法( ...
- 每周一练 之 数据结构与算法(Stack)
最近公司内部在开始做前端技术的技术分享,每周一个主题的 每周一练,以基础知识为主,感觉挺棒的,跟着团队的大佬们学习和复习一些知识,新人也可以多学习一些知识,也把团队内部学习氛围营造起来. 我接下来会开 ...
- 【算法】273-每周一练 之 数据结构与算法(Tree)
这是第六周的练习题,最近加班比较多. 下面是之前分享的链接: [算法]200-每周一练 之 数据结构与算法(Stack) [算法]213-每周一练 之 数据结构与算法(LinkedList) [算法] ...
- 【算法】272-每周一练 之 数据结构与算法(Dictionary 和 HashTable)
这是第五周的练习题,上周忘记发啦,这周是复习 Dictionary 和 HashTable. 下面是之前分享的链接: [算法]200-每周一练 之 数据结构与算法(Stack) [算法]213-每周一 ...
- 数据结构与算法(1)----->排序
这一版块,把必备的数据结构和算法做一个总结!包括排序.队列.链表.二叉树.排组合,动态规划....... 总结的过程包括理论部分,练题目可以自己去leetcode/牛客网刷起来- 第一篇文章讲排序- ...
- PHP 程序员学数据结构与算法之《栈》
“要成高手,必练此功”. 要成为优秀的程序员,数据结构和算法是必修的内容.而现在的Web程序员使用传统算法和数据结构都比较少,因为很多算法都是包装好的,不用我们去操心具体的实现细节,如PHP的取栈 ...
随机推荐
- ACE框架 基于共享内存的分配器
ACE框架提供了一个内存分配器模板,并且提供了(仅且)一个模板实例,基于共存内存的内存分配器.这个共存内存分配器模板实例在ACE框架应用于,基于内存映射的进程通讯,以及进程间同步等. ACE内存分配器 ...
- 自制反汇编工具使用实例 其二(使用xmm寄存器初始化对象,以及空的成员函数指针)
在反汇编代码中,当看到xmm寄存器,第一反应是将要进行浮点操作或访问,但是更加多的情况是在使用xmm寄存器初始化局部对象. 下面是自制反汇编工具翻译出来的代码: // -[CALayer setAll ...
- js数组合并以及对象的遍历
这是很基础的知识,but,对于一只未系统学习过js,只略懂搬砖的跨界狗,还是经常犯错: 场景:移动端上拉加载更多. 初始数组合并后来请求的数组. 使用concat方法,不过要主要: 使用concat, ...
- vue使用talkIngData统计
上篇刚使用了百度统计,由于后端同事没有找到百度统计的api,于是就找了个talkingData平台... 平台地址 依旧是先注册 进入应用统计分析 创建应用 获得appid 在vue中埋点 1.in ...
- Lab6:进程的调度
CPU调度 从就绪队列中挑选下一个占用CPU运行的进程,从多个可用CPU中挑选就绪进程可使用的CPU资源 调度策略 比较调度算法的准则 CPU使用率 吞吐量 周转时间 就绪等待时间 响应时间 吞吐量与 ...
- Flink中的CEP复杂事件处理 (源码分析)
其实CEP复杂事件处理,简单来说你可以用通过类似正则表达式的方式去表示你的逻辑,表现能力非常的强,用过的人都知道 开篇先偷一张图,整体了解Flink中的CEP中的 一种重要的图 NFA非确定有限状 ...
- poj 2991 起重机
地址 http://poj.org/problem?id=2991 题解 本来以为这是一个简单的线段树模板 不料始终不太明白线段树如何记录转动角度后的各个线段端的XY值 学习了网络上的一些博客题解 感 ...
- CentOS 7 Cobbler 自动化安装系统
在上一篇Cobbler 安装中,配置好了Cobbler,下面来配置自动化安装 配置cobbler-DHCP # 修改settings中参数,由cobbler控制dhcp [root@cobbler ~ ...
- MySQL分层和查询数据的流程
MySQL分层 MySQL分层 主要分为:连接层,服务层,引擎层,存储层 客户端执行一条select命令的流程如下 连接器 功能: 负责跟客户端建立连接.获取权限.维持和管理连接 细节: 1.当用户登 ...
- C语言博客作业10
一.本周教学内容&目标 第4章 循环结构 4.5 综合介绍循环结构的程序设计,涉及到多个典型算法.要求学生能够根据实际情况,选择合适的算法.合理的循环结构,熟练的编写程序. 二.本周作业头 这 ...