每周一练 之 数据结构与算法(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的取栈 ...
随机推荐
- java编程思想第四版第七章总结
1. 实现类的复用通常有两种方式 组合:在新的类中产生现有类的对象 继承:按照现有类的类型来创造新类 2. 一个特殊的方法toString() 在非基本类型的对象中, 都有toString()方法 当 ...
- PhpStudy BackDoor2019 深度分析
笔者<Qftm>原文发布<合天>:https://mp.weixin.qq.com/s?__biz=MjM5MTYxNjQxOA==&mid=2652852661&am ...
- 领扣(LeetCode)数字转换为十六进制数 个人题解
给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写. 十六进制字符串中不能包含多余的前导零.如果要转化的数 ...
- SpringBoot系列之切换log4j日志框架
SpringBoot系列之使用切换log4j日志框架 ok,在pom文件右键->Diagrams->show Dependencies....,如图,找到spring-boot-start ...
- 7. SOFAJRaft源码分析—如何实现一个轻量级的对象池?
前言 我在看SOFAJRaft的源码的时候看到了使用了对象池的技术,看了一下感觉要吃透的话还是要新开一篇文章来讲,内容也比较充实,大家也可以学到之后运用到实际的项目中去. 这里我使用Recyclabl ...
- 函数式接口的使用 (Function、Predicate、Supplier、Consumer)
参考:https://blog.csdn.net/jmj18756235518/article/details/81490966 函数式接口 定义:有且只有一个抽象方法的接口 Function< ...
- element 时间限制 结束时间大于开始时间 数组形式
组件中 绑定focus时间 <el-form-item v-for="(item, index) in ruleForm.yunqiDateArr" :key="i ...
- [ASP.NET Core 3框架揭秘] 异步线程无法使用IServiceProvider?
标题反映的是上周五一个同事咨询我的问题,我觉得这是一个很好的问题.这个问题有助于我们深入理解依赖注入框架在ASP.NET Core中的应用,以及服务实例的生命周期. 一.问题重现 我们通过一个简单的实 ...
- ip地址计算
1.多少个子网? 2x个,其中x为被遮盖(取值为1)的位数.例如,在11000000(这个值是子网掩码的最后几位,例如,mask=18)中,取值为1的位数为2,因此子网数位22=4个: 2.每个子网包 ...
- 程序员的算法课(17)-常用的图算法:深度优先(DFS)
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...