力扣刷题记录 3 字符串 10道题

# 380、O(1) 时间插入、删除和获取随机元素

哈希
    哈希算法
        通过一个散列函数将任意长度的输入转化为固定长度的输出
        在哈希表中用来计算某个键值存储的地址
        因此哈希表的查询时间复杂度即为哈希算法的时间复杂度 O(1)
        牺牲空间复杂度从而换取时间复杂度
    负载因子
        存储数据的个数 / 使用空间的数量(小于1)
        太小容易导致哈希冲突,太大浪费空间
    哈希表
        本质上与字典类似,都是存储的键值对
        但是哈希表可以利用哈希算法提高查询速度
        即哈希表中元素的存储位置与其本身存在函数关系
    解决冲突
        线性探查;双散列函数:跳跃探查
    构造散列函数
        直接寻址:线性函数关系;数学分析:取部分;
        平方取中;折叠;随机数;除留余数

randint(a,b)
    取 [a,b] 之间的整数
    闭区间,两端都可以取得到

# 238、除自身以外数组的乘积

思路
    前后缀乘积列表
    前缀乘积存储在最后的答案中并更新
    后缀乘积存储在一个常数中并更新
    前后各循环一次

# 134、加油站

思路
    双重循环遍历数组
        每次寻找下一个不能到达的加油站
        下一个循环从该加油站开始
        因为中间的加油站出发也不可能到达该加油站的下一个
    单次循环
        找到从开始累计的最小剩余油量(负数)所在的位置
        需要判断总剩余油量若为负返回-1
        否则该位置的下一个位置即为所求

注意
    该题保证只有唯一解
    因此可以采用贪心思想

# 13、罗马数字转整型

思路
    哈希表字典存储单一罗马字符对应的键值
        遍历整个字符串后累加求解
    如何处理 IV IX 等情况
        字典中将两个字母的情况也存下来
        左比右小则先减 I 后加 V X
        将 IV 存为3 IX 存为 8,保证累加结果不变

# 12、整型转罗马数字

思路
    贪心+哈希表
        每次找最大匹配的键值
    暴力匹配
        把诸如 II III 通通存进哈希表

# 58、最后一个单词的长度

思路
    反向遍历,遇见空格停止,统计单词长度

注意
    可能文末还有额外空格
# 14、最长公共前缀

思路
    横向遍历
        遍历所有单词,同时维护更新最长公共前缀
    纵向遍历
        依次比较每个单词相同位置的字符
    分治
        所有字符串的最长公共前缀一定是子字符串集的公共前缀
    二分查找
        最长公共前缀不会超过最短字符串长度
        依次迭代递归查找二分长度的子字符串是否为公共子字符串
    后两个方法不比前两个更优

# 151、反转字符串中的单词

思路
    倒序遍历
        从后往前遍历字符串,每找到一个单词,就加入最终字符串
    调库
        split reverse join,划分单词、翻转单词、重新组合
    双端队列
        头尾均可,类似于双向栈

# 6、Z字形变换

思路
    二维矩阵
        压缩矩阵空间,减少为空的元素
    下标取模
        直接获取对应行列元素下标关系
    变向模拟
        多个子字符串分别存储各行,最后合并

# 28、找出字符串中第一个匹配项的下标

思路
    暴力匹配:两个指针分别遍历待匹配字符串和匹配字符串
    KMP算法:每次匹配失败时,寻找匹配串相同前后缀的下一位
    Sunday算法:未找到匹配时通过偏移表决定下一匹配位置

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问题的关键。需要仔细分析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值