算法| ss 哈希表

文章介绍了JavaScript中的四个编程问题:两数之和的解决方案、查找是否存在重复元素的方法、验证字母异位词的函数以及两个数组的交集。每个问题都展示了如何利用数据结构如map和set来解决常见IT题目。
  • 1.两数之和
  • 219.存在重复元素 2
  • 242.有效的字母异位词
  • 349.两个数组的交集
  • 49.字母异位词分组

1.两数之和

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
// 思路
// for循环遍历nums
// 创建map, key= 目标值-nums[i]
// key对应的值存在,则有结果, 结果为 map[cur] i
// key对应的值不存在, 则往map里添加该key
var twoSum = function (nums, target) {
  const map = {};
  let ans = [];
  for (let i = 0; i < nums.length; i++) {
    let key = target - nums[i];
    if (map[key] !== undefined) {
      ans[0] = map[key];
      ans[1] = i;
      break;
    } else {
      map[nums[i]] = i;
    }
    // console.log(map);
  }
  //   console.log(ans);
  return ans;
};
twoSum([2, 7, 11, 15], 9);
// 输入:nums = [2,7,11,15], target = 9
// 输出:[0,1]

219.存在重复元素2

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {boolean}
 */
// 思路
// 维持一个k长度的set集合
// 建立sets集合
// 如果集合里有数据了 则返回true
// 加入数据到集合
// 如果sets长度超过k了, 则删除第一个
var containsNearbyDuplicate = function (nums, k) {
  const sets = new Set();
  for (let i = 0; i < nums.length; i++) {
    if (sets.has[nums[i]]) return true;
    sets.add(nums[i]);
    if (sets.size > k) {
      sets.delete(nums[i - k]);
    }
  }
  return false;
};
console.log(containsNearbyDuplicate([1, 2, 3, 1], 3));
console.log(containsNearbyDuplicate([1, 2, 3, 1, 2, 3], 2));
// nums = [1,2,3,1], k = 3

242.有效的字母异位词

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
// 思路
// 判断s t的长度是否相等
// 统计s的map统计
// 循环遍历t, 对map进行减法操作
// 最后判断map中所有的值是否为0
var isAnagram = function (s, t) {
  if (s.length != t.length) return false;
  const map = {};
  for (let ch of s) {
    map[ch] = (map[ch] ?? 0) + 1;
  }
  for (let ch of t) {
    if (map[ch]) {
      map[ch] -= 1;
    }
  }
  let ans = Object.values(map).every((item) => item === 0);
  console.log(ans);
  return ans;
};
isAnagram("anagram", "nagaram");
isAnagram("rat", "car");
// s = "anagram", t = "nagaram"

349.两个数组的交集

/** 349. 两个数组的交集(集合去重后筛选、优化、字典)
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
// 思路
// Set的使用
var intersection = function (nums1, nums2) {
  const sets = new Set(nums1);
  const ans = new Set();
  for (let i = 0; i < nums2.length; i++) {
    if (sets.has(nums2[i])) {
      ans.add(nums2[i]);
    }
  }
  console.log([...ans]);
  return [...ans];
};
intersection([1, 2, 2, 1], [2, 2]);
// nums1 = [1,2,2,1], nums2 = [2,2]

49. 字母异位词分组

/**
 * @param {string[]} strs
 * @return {string[][]}
 */
// 思路
// 构建map对象
// for遍历
// 将元素分割 排序, 再合并
// 存入对象中,如果有则追加
// 将对象key对应的数组输出
var groupAnagrams = function (strs) {
  const map = new Map();
  for (let str of strs) {
    const key = str.split("").sort().join();
    if (map.has(key)) {
      map.get(key).push(str);
    } else {
      map.set(key, [str]);
    }
  }
  console.log([...map.values()]);
  return [...map.values()];
};
// strs = ["a"]
groupAnagrams(["a"]);

<think>好的,我现在需要解决用户的问题:“易语言咋写吧时间和文本写到哈希表”。首先,我需要理解用户的具体需求。用户可能正在使用易语言,想要将时间和文本类型的数据存储到哈希表中,但不知道如何操作。根据用户之前的提问历史,他们已经询问过易语言哈希表的使用教程,现在可能是在具体应用时遇到了问题。 首先,我应该回顾之前提供的教程内容。在之前的回答中,我介绍了两种方法:使用核心支持库的自定义数据类型数组和第三方模块(如精易模块的类_哈希表)。用户现在的问题可能涉及如何将时间和文本这两种不同的数据类型存入哈希表,需要注意易语言的数据类型处理。 接下来,我需要考虑用户可能遇到的难点。时间在易语言中通常使用“日期时间型”或通过文本表示,而文本型则是基本类型。哈希表的键通常是文本型,但值可能需要处理多种类型。使用核心支持库的自定义数组方法时,可能需要处理通用型数据,而第三方模块可能已经封装了这些处理。 然后,我需要确定回答的结构。应该分步骤说明两种方法:使用核心支持库和第三方模块。每种方法都需要示例代码,并解释如何存储和读取时间和文本数据。同时,要指出注意事项,如键的唯一性、类型转换等。 还要注意用户可能的误区。例如,使用自定义数组时,如果直接存储日期时间型,可能需要转换,或者使用文本型存储时间。需要建议最佳实践,比如使用文本格式的时间以便于处理。 此外,需要验证示例代码的正确性。比如,在核心支持库方法中,自定义数据类型的成员“值”设为通用型是否可行,或者是否需要其他处理。在第三方模块部分,确保类_哈希表的方法如“置值”和“取值”支持不同类型的数据。 最后,总结两种方法的优缺点,帮助用户根据项目需求选择合适的方法。可能还需要提醒用户关于内存管理和线程安全的问题,尤其是在处理大量数据时。 现在,我需要将这些思考整理成清晰的中文回答,分步骤说明,并提供正确的代码示例。确保语言简洁易懂,符合用户的技术水平。</think>以下是易语言中将时间和文本写入哈希表的两种实现方案,包括基础方法和高效方法: --- ### **一、使用核心支持库实现(数组模拟哈希表)** #### 1. 定义数据结构 ```easycode .数据类型 哈希表成员 .成员 键,文本型 .成员 值,通用型 ' 可存储任意类型数据 .局部变量 哈希表数组,哈希表成员,数组,0 ``` #### 2. 写入时间与文本 ```easycode ' 添加时间数据(时间→文本转换) 重定义数组(哈希表数组, 真, 取数组成员数(哈希表数组) + 1) 哈希表数组[取数组成员数(哈希表数组)].键 = "登录时间" 哈希表数组[取数组成员数(哈希表数组)].值 = 到文本(取现行时间()) ' 输出示例:2024-01-01 12:00:00 ' 添加文本数据 重定义数组(哈希表数组, 真, 取数组成员数(哈希表数组) + 1) 哈希表数组[取数组成员数(哈希表数组)].键 = "用户消息" 哈希表数组[取数组成员数(哈希表数组)].值 = "Hello World" ``` #### 3. 读取数据示例 ```easycode .函数 读取时间,日期时间型 .参数 键名,文本型 .局部变量 i,整数型 .计次循环首(取数组成员数(哈希表数组), i) .如果真(哈希表数组[i].键 == 键名) 返回(到时间(哈希表数组[i].值)) ' 需要反向转换 .如果真结束 .计次循环尾() 返回({ 0000-00-00 }) ' 返回空时间表示未找到 ``` --- ### **二、使用精易模块实现(推荐方案)** #### 1. 初始化哈希表 ```easycode .局部变量 哈希表,类_哈希表 哈希表.创建() ' 初始化哈希表 ``` #### 2. 写入混合类型数据 ```easycode ' 存储时间(自动处理类型转换) 哈希表.置值("最后更新时间", 取现行时间()) ' 直接存储日期时间型 ' 存储文本 哈希表.置值("系统状态", "运行中") ' 混合存储示例 哈希表.置值("日志记录", "时间:" + 到文本(取现行时间()) + " 事件:用户登录") ``` #### 3. 读取数据方法 ```easycode ' 读取时间数据 .局部变量 更新时间,日期时间型 更新时间 = 哈希表.取值时间("最后更新时间") ' 读取文本数据 .局部变量 状态文本,文本型 状态文本 = 哈希表.取文本("系统状态") ``` --- ### **三、高级技巧** #### 1. 时间格式处理建议 ```easycode ' 使用统一格式存储时间 哈希表.置值("标准化时间", 时间_格式化(取现行时间(), "yyyy-MM-dd HH:mm:ss")) ``` #### 2. 批量操作示例 ```easycode ' 批量添加日志 .计次循环首(10, i) 哈希表.置值("日志_" + 到文本(i), 时间_格式化(取现行时间(), "HH:mm:ss") + " 事件" + 到文本(i)) .计次循环尾() ``` --- ### **四、避坑指南** 1. **类型转换问题** - 使用`取变量类型()`判断数据类型 ```easycode .如果(取变量类型(哈希表.取值("最后更新时间")) == #日期时间型) 输出调试文本("这是有效时间数据") .否则 输出调试文本("数据类型错误") .如果结束 ``` 2. **键名命名规范** - 使用英文键名更安全(避免编码问题) - 示例:用`last_update_time`代替`最后更新时间` 3. **性能优化** ```easycode 哈希表.创建(100) ' 预分配100个元素的存储空间 哈希表.设置哈希函数(#哈希算法_MD5) ' 使用更高效的哈希算法 ``` --- ### **五、调试输出示例** ```easycode ' 查看所有键值对 .局部变量 键数组,文本型,数组,0 .局部变量 值数组,文本型,数组,0 哈希表.取所有键值(键数组, 值数组) .计次循环首(取数组成员数(键数组), i) 输出调试文本("键:" + 键数组[i] + " / 值:" + 到文本(值数组[i])) .计次循环尾() ``` --- **方案选择建议**: - 小型数据(<100条):使用核心库方案 - 正式项目(需高性能):必须使用精易模块或E2EE支持库 - 时间敏感型数据:推荐存储时间戳(`取时间戳()`)而非文本格式 通过上述方法,您可以灵活地在易语言哈希表中存储时间、文本及其混合数据类型。实际开发中建议优先使用第三方模块方案,其内置的类型自动转换机制能显著降低开发复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值