每周一练 之 数据结构与算法(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的取栈 ...
随机推荐
- Linux命令大全(个人整理,如不全面望谅解)
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...
- Java枚举——枚举的作用、使用方法、使用场景
枚举的定义 枚举关键字enum 枚举类是一种特殊类,它和普通类一样可以使用构造器.定义成员变量和方法,也可以实现多个接口,但不能继承类. 枚举的使用 enum Color { RED, BLUE, G ...
- Java基础知识总结之垃圾回收机制
垃圾回收机制 Java垃圾回收机制是Java语言的重要功能之一.当程序创建对象,数组等引用类型对象时,系统会自动在内存区为之分配一块内存,对象就保存在这块内存区内,当这块内存不再被任何变量引用时,这块 ...
- 作业要求20191107-6 beta week 2/2 Scrum立会报告+燃尽图 05
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9958 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩 ...
- python3 之 文件read方法(read、readline、readlines)
目录 一.read方法 二.readline方法 三.readlines方法 正文 python3中,读取文件有三种方法:read().readline().readlines(). 此三种方法,均支 ...
- DDD实战与进阶 - 值对象
目录 DDD实战与进阶 - 值对象 概述 何为值对象 怎么运用值对象 来看一个例子 值对象的持久化 总结 DDD实战与进阶 - 值对象 概述 作为领域驱动设计战术模式中最为核心的一个部分-值对象.一直 ...
- 为什么 Redis 是单线程的?
以前一直有个误区,以为:高性能服务器 一定是 多线程来实现的 原因很简单因为误区二导致的:多线程 一定比 单线程 效率高.其实不然. 在说这个事前希望大家都能对 CPU . 内存 . 硬盘的速度都有了 ...
- 记一次uboot中gunzip解压速度慢的问题排查
背景 在项目中需要用到解压功能,之前还记录了下,将uboot解压代码移植到另外的bootloader中时,碰到的效率问题.最终查明是cache的配置导致的. https://www.cnblogs.c ...
- Rust入坑指南:鳞次栉比
很久没有挖Rust的坑啦,今天来挖一些排列整齐的坑.没错,就是要介绍一些集合类型的数据类型."鳞次栉比"这个标题是不是显得很有文化? 在Rust入坑指南:常规套路一文中我们已经介绍 ...
- 前端vue实现pdf文件的在线预览
3.前端vue实现pdf文件的在线预览 我是通过 <iframe> 标签就可以满足我工作的 pdf预览需求 如果<iframe> 无法满足需求 , 可以使用pdf.js这个插件 ...