victory的博客

长安一片月,万户捣衣声

0%

344.反转字符串

题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:
输入:[“h”,”e”,”l”,”l”,”o”]
输出:[“o”,”l”,”l”,”e”,”h”]

题目链接

思路

  1. 字符串切片 —> reversString()

  2. 使用list.reverse()方法 —> reversString1()

  3. 使用reversed()函数 —> reversString2()

  4. 使用栈 —> reversString3()
    将s列表看作一个栈,低端作为栈底,高端作为栈顶,依次将栈顶元素出栈即可。

  5. for —> reversString4()
    将列表中的第i个元素与倒数第i个元素交换(0< i < len(s)//2)

  6. 递归 —> reversString5()

阅读全文 »

67.二进制求和

题目描述

给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。

示例 1:
输入: a = “11”, b = “1”
输出: “100”

题目链接

思路

  1. 先将 a 和 b 转化成十进制数,求和后再转化为二进制数

  2. 列竖式
    末尾对齐,逐位相加,逢二进一
    具体的,我们可以取 n=max{∣a∣,∣b∣},循环 n 次,从最低位开始遍历。我们使用一个变量 carry 表示上一个位置的进位,初始值为 0。记当前位置对其的两个位为 ai​ 和 bi​,则每一位的答案为 (carry+ai+bi) mod 2,下一位的进位为 ⌊(carry+ai+bi)/2⌋。重复上述步骤,直到数字 a 和 b 的每一位计算完毕。最后如果 carry 的最高位不为 0,则将最高位添加到计算结果的末尾。
    注意,为了让各个位置对齐,你可以先反转这个代表二进制数字的字符串,然后低下标对应低位,高下标对应高位。当然你也可以直接把 a 和 b 中短的那一个补 0 直到和长的那个一样长,然后从高位向低位遍历,对应位置的答案按照顺序存入答案字符串内,最终将答案串反转。

阅读全文 »

125.验证回文串

题目描述

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
解释:”amanaplanacanalpanama” 是回文串

题目链接

思路

1.判断第i(0 < i < len(new_s)//2)个字符与倒数第i个字符是否相等来确定字符串是否回文,其中new_s是去除了除数字字母外字符的字符串
2.判断反转字符串是否与原字符串相同
3.双指针(去除除数字字母外的其他字符)
初始时,左右指针分别指向字符串的两侧,随后我们不断地将这两个指针相向移动,每次移动一步,并判断这两个指针指向的字符是否相同。当这两个指针相遇时,就说明是回文串。
4.双指针(直接在原字符串上进行判断)
与3.相同

阅读全文 »

38.外观数列

题目描述

给定一个正整数 n ,输出外观数列的第 n 项。
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

你可以将其视作是由递归公式定义的数字字符串序列:
countAndSay(1) = “1”
countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。
前五项如下:

  1. 1
    
  2. 11
    
  3. 21
    
  4. 1211
    
  5. 111221
    
    第一项是数字 1
    描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 “11”
    描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 “21”
    描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 “1211”
    描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 “111221”
    要 描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。

题目链接

阅读全文 »

\1…\9

\1…\9用来匹配与第n(1~9)个分组的内容,必须与()配合使用
例:在以下代码段中\2表示匹配第2个分组(一个括号代表一个分组)的内容,即\2匹配”world”字符串

import re
string = "helloworld world"
pattern = r'^(\w+)(world) \2$'
print(re.search(pattern, string))

参考资料

28.实现strStr()

题目描述

实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
题目链接

思路

  1. 直接调用python内置方法

  2. 暴力匹配
    让字符串 needle 与字符串 haystack 的所有长度为 m(needle字符串的长度) 的子串均匹配一次。
    为了减少不必要的匹配,我们每次匹配失败即立刻停止当前子串的匹配,对下一个子串继续匹配。如果当前子串匹配成功,我们返回当前子串的开始位置即可。如果所有子串都匹配失败,则返回 −1-1−1。
    3.kmp算法
    kmp算法的目的:为了避免不必要的指针回溯
    主串指针i不回溯,模式串指针j的变化取决于模式串的结构是否有重复
    pi数组值的计算:
    pi数组的值为最长相同前后缀长度+1(串本身不能作为前后缀)
    pi[1]=0,其他情况next[]=1.

阅读全文 »

496.下一个更大元素

题目描述

给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。

题目链接

思路

1.暴力解法
对于每一个 nums1[i] 中的元素,先在 nums2 中找到它,然后向右遍历找到第 1 个大于 nums1[i] 的元素。
2.单调栈
步骤:
1)使用单调栈先对 nums2 中的每一个元素,求出它的右边第一个更大的元素;
2)将上一步的对应关系放入哈希表(HashMap)中;
3)再遍历数组 nums1,根据哈希表找出答案。
维护单调栈:
我们维护的栈恰好保证了单调性:栈中的元素从栈顶到栈底是单调不降的。
当我们遇到一个新的元素 nums2[i] 时,我们判断栈顶元素是否小于 nums2[i],
如果是,那么栈顶元素的下一个更大元素即为 nums2[i],我们将栈顶元素出栈。
重复这一操作,直到栈为空或者栈顶元素大于 nums2[i]。此时我们将 nums2[i] 入栈,
保持栈的单调性,并对接下来的 nums2[i + 1], nums2[i + 2] … 执行同样的操作。

阅读全文 »

237.删除链表中的节点

题目描述

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。

题目链接

思路

由于单链表不能直接访问当前节点的前一个节点,现要删除当前节点,我们可以将当前节点的下一个节点的值复制到当前节点,然后改变当前节点的next指针删除当前节点的下一个节点即可达到删除当前节点的效果。

阅读全文 »