【golang】leetcode初级-验证回文串&字符串转换整数

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

示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串

提示:
1 <= s.length <= 2 * 105
字符串 s 由 ASCII 字符组成
解题思路
根据示例显然,验证是否是回文串之前,由于

只考虑字母和数字字符,可以忽略字母的大小写

所以对于给定的字符串,我们应该
提取出字符串中属于字符和数字的部分 忽略其余的符号

然后我们只需验证提取出的字符串是否是回文串就行了
代码
func isPalindrome(s string) bool { if len(s)==1{ return true } var ss []byte for i, n := range s { if n <= 'Z' && n >= 'A' { ss = append(ss, s[i]+32) } if n >= 'a' && n <= 'z' || n >= '0' && n <= '9' { ss = append(ss, s[i]) } } if ss==nil {return true} for i := 0; i <= len(ss)/2; i++ { if ss[i] != ss[len(ss)-i-1] { return false } } return true }

复杂度分析
时间复杂度:O(∣s∣),其中 ∣s∣ 是字符串 ss 的长度。
空间复杂度:O(∣s∣)。由于我们需要将所有的字母和数字字符存放在另一个字符串中,在最坏情况下,新的字符串与原字符串 s 完全相同,因此需要使用 O(∣s∣) 的空间。
优化
借鉴官方解析第二个方法
可以使用双指针直接在原数组上进行操作,将空间复杂度优化为常数级别
代码如下
func isPalindrome(s string) bool { s = strings.ToLower(s) left, right := 0, len(s) - 1 for left < right { for left < right && !isalnum(s[left]) { left++ } for left < right && !isalnum(s[right]) { right-- } if left < right { if s[left] != s[right] { return false } left++ right-- } } return true }func isalnum(ch byte) bool { return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') }作者:LeetCode-Solution 链接:https://leetcode-cn.com/problems/valid-palindrome/solution/yan-zheng-hui-wen-chuan-by-leetcode-solution/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

第二题 题目信息
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [?231,231 ? 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 ?231 的整数应该被固定为 ?231 ,大于 231 ? 1 的整数应该被固定为 231 ? 1 。
返回整数作为最终结果。
注意:
本题中的空白字符只包括空格字符 ' ' 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
解题思路
【【golang】leetcode初级-验证回文串&字符串转换整数】1,需要去掉前导空格;
2,需要判断第 1 个字符为 + 和 - 的情况,因此,可以设计一个变量 sign,初始化的时候为 1,如果遇到 - ,将 sign 修正为 -1;
3,判断是否是数字,可以使用字符的 ASCII 码数值进行比较,即 0 <= c <= '9';
4,在遇到第 1 个不是数字的字符的情况下,转换停止,退出循环;
5,如果转换以后的数字超过了 int 类型的范围,需要截取。
代码
func myAtoi(s string) int { num, sign, i, n := 0, 1, 0, len(s)for i < n && s[i] == ' ' { i++ }if i < n { if s[i] == '-' { sign = -1 i++ } else if s[i] == '+' { sign = 1 i++ } } for i < n && s[i] >= '0' && s[i] <= '9' { num = 10*num + int(s[i]-'0') if sign*num < math.MinInt32 { return math.MinInt32 } else if sign*num > math.MaxInt32 { return math.MaxInt32 } i++ } return sign * num }

复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)

    推荐阅读