从零开始的力扣刷题记录-第二十天

剑指 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
}

总结

比较顺利的一天,没有什么难题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值