摘要:一集合是什么與它相關數學概念有哪些解題集合定義集合是一種包含不同元素的數據結構。集合中的元素稱為成員,集合最重要的兩個特點集合中的成員是無序集合中不存在相同成員即無序且唯一。
這是第四周的練習題,五一放假結束,該收拾好狀態啦。
下面是之前分享的鏈接:
1.每周一練 之 數據結構與算法(Stack)
2.每周一練 之 數據結構與算法(LinkedList)
3.每周一練 之 數據結構與算法(Queue)
歡迎關注我的 個人主頁 && 個人博客 && 個人知識庫 && 微信公眾號“前端自習課”
本周練習內容:數據結構與算法 —— 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], [] ]
來源:leetcode 78.集合
解題:
目前網絡上的最優解:
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 的題目。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104120.html
摘要:什么是散列表和散列函數哈希表,也叫散列表,是根據關鍵碼值而直接進行訪問的數據結構。根據鍵值從散列表中移除值。請實現散列表將和存在一個對象中即可定義一個包含和屬性的類并分配到散列表。 showImg(https://segmentfault.com/img/remote/1460000019005270); 這是第五周的練習題,上周忘記發啦,這周是復習 Dictionary 和 Hash...
摘要:什么是散列表和散列函數哈希表,也叫散列表,是根據關鍵碼值而直接進行訪問的數據結構。將字典的所有鍵名以數組的形式返回。根據鍵值從散列表中移除值。這是第五周的練習題,上周忘記發啦,這周是復習 Dictionary 和 HashTable。 下面是之前分享的鏈接: 1.每周一練 之 數據結構與算法(Stack) 2.每周一練 之 數據結構與算法(LinkedList) 3.每周一練 之 數據結構...
摘要:與堆棧區別隊列的操作方式和堆棧類似,唯一的區別在于隊列只允許新數據在后端進行添加。移除隊列的第一項,并返回被移除的元素。三使用隊列計算斐波那契數列的第項。前兩項固定為,后面的項為前兩項之和,依次向后。 showImg(https://segmentfault.com/img/remote/1460000019005270); 這是第二周的練習題,這里補充下咯,五一節馬上就要到了,自己的...
摘要:假設一個二叉搜索樹具有如下特征節點的左子樹只包含小于當前節點的數。所有左子樹和右子樹自身必須也是二叉搜索樹。代碼實現二叉樹節點定義來源驗證二叉搜索樹解析 showImg(https://segmentfault.com/img/remote/1460000019005270); 這是第六周的練習題,最近加班比較多,上周主要完成一篇 GraphQL入門教程 ,有興趣的小伙伴可以看下哈。 ...
摘要:假設一個二叉搜索樹具有如下特征節點的左子樹只包含小于當前節點的數。所有左子樹和右子樹自身必須也是二叉搜索樹。代碼實現二叉樹節點定義來源驗證二叉搜索樹解析這是第六周的練習題,最近加班比較多,上周主要完成一篇 GraphQL入門教程 ,有興趣的小伙伴可以看下哈。 下面是之前分享的鏈接: 1.每周一練 之 數據結構與算法(Stack) 2.每周一練 之 數據結構與算法(LinkedList) 3...
閱讀 3753·2021-09-22 15:49
閱讀 3310·2021-09-08 09:35
閱讀 1426·2019-08-30 15:55
閱讀 2326·2019-08-30 15:44
閱讀 719·2019-08-29 16:59
閱讀 1605·2019-08-29 16:16
閱讀 485·2019-08-28 18:06
閱讀 897·2019-08-27 10:55