集合的实现

function Set () {
this.dataStore = [];
this.add = add;
this.remove = remove;
this.size = size;
this.union = union;
this.intersect = intersect;
this.subset = subset;
this.difference = difference;
this.show = show;
this.contains = contains;
}
function add (data) {
if (this.dataStore.indexOf(data) < 0) {
this.dataStore.push(data);
return true;
} else {
return false;
}
}
function remove (data) {
let pos = this.dataStore.indexOf(data);
if (pos > -1) {
this.dataStore.splice(pos, 1);
return true;
} else {
return false;
}
}
function show () {
return this.dataStore;
}
function contains (data) {
if (this.dataStore.indexOf(data) > -1) {
return true;
} else {
return false;
}
}
function union (set) {
let tempSet = new Set();
for (let i = 0; i < this.dataStore.length; ++i) {
tempSet.add(this.dataStore[i]);
}
for (let i = 0; i < set.dataStore.length; ++i) {
if (!tempSet.contains(set.dataStore[i])) {
tempSet.dataStore.push(set.dataStore[i]);
}
}
return tempSet;
}
function intersect (set) {
let tempSet = new Set();
for (let i =0; i < this.dataStore.length; ++i) {
if (set.contains(this.dataStore[i])) {
tempSet.add(this.dataStore[i]);
}
}
return tempSet;
}
function subset (set) {
if (this.size() > set.size()) {
return false;
} else {
for (let i = 0; i < this.dataStore.length; ++i) {
if (!set.contains(this.dataStore[i])) {
return false;
}
}
}
return true;
}
function size () {
return this.dataStore.length;
}
function difference (set) {
let tempSet = new Set();
for (let i = 0; i < this.dataStore.length; ++i) {
if (!set.contains(this.dataStore[i])) {
tempSet.add(this.dataStore[i]);
}
}
return tempSet;
}

练习

一. 修改集合类,使里面的元素按顺序存储。写一段测试代码来测试你的修改。

// 修改add方法
function add (data) {
if (this.dataStore.indexOf(data) < 0) {
this.dataStore.push(data);
// 排序
this.dataStore = this.dataStore.sort((a, b) => a - b);
return true;
} else {
return false;
}
}
// 示例
let s = new Set();
s.add(23);
s.add(3);
s.add(2);
s.add(24);
s.add(73);
console.log(s.show()); // [2, 3, 23, 24, 73]

二. 为集合类增加一个higher(element)方法,该方法返回比传入元素大的元素中最小的那个。写一段测试代码来测试这个方法。

Set.prototype.higher = function (element) {
let arr = [];
for (let i = 0; i < this.dataStore.length; ++i) {
if (this.dataStore[i] > element) {
arr.push(this.dataStore[i]);
}
}
return arr.sort((a, b) => a - b)[0];
};
// 示例
let s = new Set();
s.add(23);
s.add(3);
s.add(2);
s.add(24);
s.add(73);
console.log(s.higher(20)); // 23
console.log(s.higher(60)); // 73

三. 为集合类增加一个lower(element)方法,该方法返回比传入元素小的元素中最大的那个。写一段测试代码来测试这个方法。

Set.prototype.lower = function (element) {
let arr = [];
for (let i = 0; i < this.dataStore.length; ++i) {
if (this.dataStore[i] < element) {
arr.push(this.dataStore[i]);
}
}
return arr.sort((a, b) => b - a)[0];
};
// 示例
let s = new Set();
s.add(23);
s.add(3);
s.add(2);
s.add(24);
s.add(73);
console.log(s.lower(20)); // 3
console.log(s.lower(60)); // 24

JavaScript数据结构与算法-集合练习

JavaScript数据结构与算法-集合练习的更多相关文章

  1. 为什么我要放弃javaScript数据结构与算法(第六章)—— 集合

    前面已经学习了数组(列表).栈.队列和链表等顺序数据结构.这一章,我们要学习集合,这是一种不允许值重复的顺序数据结构. 本章可以学习到,如何添加和移除值,如何搜索值是否存在,也可以学习如何进行并集.交 ...

  2. 为什么我要放弃javaScript数据结构与算法(第十一章)—— 算法模式

    本章将会学习递归.动态规划和贪心算法. 第十一章 算法模式 递归 递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题.递归通常涉及函数调用自身. 递归函数是像下面能够直接调用自身的 ...

  3. 为什么我要放弃javaScript数据结构与算法(第九章)—— 图

    本章中,将学习另外一种非线性数据结构--图.这是学习的最后一种数据结构,后面将学习排序和搜索算法. 第九章 图 图的相关术语 图是网络结构的抽象模型.图是一组由边连接的节点(或顶点).学习图是重要的, ...

  4. 为什么我要放弃javaScript数据结构与算法(第七章)—— 字典和散列表

    本章学习使用字典和散列表来存储唯一值(不重复的值)的数据结构. 集合.字典和散列表可以存储不重复的值.在集合中,我们感兴趣的是每个值本身,并把它作为主要元素.而字典和散列表中都是用 [键,值]的形式来 ...

  5. 为什么我要放弃javaScript数据结构与算法(第五章)—— 链表

    这一章你将会学会如何实现和使用链表这种动态的数据结构,这意味着我们可以从中任意添加或移除项,它会按需进行扩张. 本章内容 链表数据结构 向链表添加元素 从链表移除元素 使用 LinkedList 类 ...

  6. 为什么我要放弃javaScript数据结构与算法(第三章)—— 栈

    有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第三章 栈 栈数据结构 栈是一种遵循后进先出(LIFO)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称为栈顶,另一 ...

  7. 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组

    第二章 数组 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构.JavaScript里也有数组类型,虽然它的第一个版本并没有支持数组.本章将深入学习数组数据结构和它的能力. 为什么 ...

  8. 为什么我要放弃javaScript数据结构与算法(第一章)—— JavaScript简介

    数据结构与算法一直是我算比较薄弱的地方,希望通过阅读<javaScript数据结构与算法>可以有所改变,我相信接下来的记录不单单对于我自己有帮助,也可以帮助到一些这方面的小白,接下来让我们 ...

  9. javascript数据结构与算法 零(前记+前言)

    前记 这本书Data Structure and Algorithm with Javascript 我将其翻译成<< javascript 数据结构和算法>> 为什么这么翻译 ...

随机推荐

  1. 【Excle】文本日期转化为日期格式

    现存在一列文本格式的日期 需要将该列转化为日期格式 方法一:使用分列 数据→分列,第三步选择[日期] 方法二:使用text函数 公式得到的结果为: 但是这样转化后的是文本型日期,需要转化为日期型得先转 ...

  2. Linux 平台如何查看某个进程的线程数?

    Linux 平台如何查看某个进程的线程数?   三种方法:1. 使用top命令,具体用法是 top -H 加上这个选项,top的每一行就不是显示一个进程,而是一个线程. 2. 使用ps命令,具体用法是 ...

  3. iOS活体人脸识别的Demo和一些思路

    代码地址如下:http://www.demodashi.com/demo/12011.html 之前公司项目需要,研究了一下人脸识别和活体识别,并运用免费的讯飞人脸识别,在其基础上做了二次开发,添加了 ...

  4. MII、GMII、RMII、SGMII、XGMII

    MII即媒体独立接口,也叫介质无关接口.它是IEEE-802.3定义的以太网行业标准.它包括一个数据接口,以及一个MAC和PHY之间的管理接口(图1). 数据接口包括分别用于发送器和接收器的两条独立信 ...

  5. C# 泛型 default()方法

    在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T: T 是引用类型还是值类型. 如果 T 为值类型,则它是数值还是结构. 给定参数化类型 T 的一个变量 t ...

  6. 459. Repeated Substring Pattern【easy】

    459. Repeated Substring Pattern[easy] Given a non-empty string check if it can be constructed by tak ...

  7. [c#.Net]正则表达式 记录

    @符号c#字符串前使用@符号,“@”表示,跟在它后面的字符串是个“逐字字符串”. string x="D:\\My Huang\\My Doc"; string y = @&quo ...

  8. 43. Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】

    [视频&交流平台] àSpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008&utm ...

  9. c++ 请抛弃匈牙利命名法 - 变量命名代码风格的建议。

    我只针对c++码农们讲,其他语言不了解不过应该大同小异.曾几何时翻开21天学通c++系列等脑残入门书,都以匈牙利命名法示人(DWORD dwXXX, int nXXX, string strXXX). ...

  10. 源代码分析Fragmentd的BackStack管理过程

    1. Fragment基本使用方法 为了管理Activity中的fragments.须要调用Activity中的getFragmentManager()方法.由于FragmentManager的API ...