剑指 Offer 57. 和为s的两个数字-简单
题目描述:
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
题解:
昨天那道中等难度的盛水题的弱化版,思路完全一致
代码(Go):
func twoSum(nums []int, target int) []int {
p,q := 0,len(nums) - 1
for p < q{
if nums[p] + nums[q] == target{
return []int{nums[p],nums[q]}
}else if nums[p] + nums[q] < target{
p++
}else{
q--
}
}
return []int{}
}
205.同构字符串-简单
题目描述:
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
题解:
维护两个哈希表,分别表示从s映射到t和从t映射到s的关系,如果发现重复映射就返回错误
代码(Go):
func isIsomorphic(s string, t string) bool {
if len(s) != len(t){
return false
}
var dicts = make(map[byte]byte)
for i := 0;i < len(s);i++{
if value,ok := dicts[s[i]];ok{
if value != t[i]{
return false
}
}else{
dicts[s[i]] = t[i]
}
}
var dictt = make(map[byte]byte)
for i := 0;i < len(s);i++{
if value,ok := dictt[t[i]];ok{
if value != s[i]{
return false
}
}else{
dictt[t[i]] = s[i]
}
}
return true
}
面试题 10.01. 合并排序的数组-简单
题目描述:
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。
初始化 A 和 B 的元素数量分别为 m 和 n。
题解:
逆向双指针,从后到前遍历,选出大的放入数组即可
代码(Go):
func merge(A []int, m int, B []int, n int) {
p,q := m - 1,n - 1
for i := len(A) - 1;i >= 0;i--{
if p == -1{
A[i] = B[q]
q--
}else if q == -1{
A[i] = A[p]
p--
}else if A[p] >= B[q]{
A[i] = A[p]
p--
}else{
A[i] = B[q]
q--
}
}
}
6.N字形变换-中等
题目描述:
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
题解:
看到的时候我估计应该有找规律的数学解,不过还是先用常规做法做了,其实只需要用一个二维矩阵去模拟就好了。看官方还可以把每一行换成队列,这样还能节省空间,不过最简单的还是找规律的数学解
代码(Go):
func convert(s string, numRows int) string {
if numRows == 1{
return s
}
var sce = make([][]byte,numRows)
flag := 0
temp := 0
for i := 0;i < numRows;i++{
scei := []byte{}
sce[i] = scei
}
for i := 0;i < len(s);i++{
sce[temp] = append(sce[temp],s[i])
if temp < numRows - 1 && flag == 0{
temp++
}else if temp == numRows - 1 && flag == 0{
temp--
flag = 1
}else if temp == 0 && flag == 1{
temp++
flag = 0
}else if temp < numRows - 1 && flag == 1{
temp--
}
}
var re string
for i := 0;i < numRows;i++{
for _,v := range sce[i]{
re += string(v)
}
}
return re
}
总结
比较顺利的一天,没有什么难题