杨氏矩阵,字符串左旋,字符串旋转结果

文章介绍了如何在杨氏矩阵中高效查找数字,利用矩阵的特性降低时间复杂度到O(1)。此外,讨论了三种不同的字符串左旋方法,包括拼接法、逐个左旋法和三次逆序法,分析了它们的时间复杂度和空间效率。最后,提出了判断字符串是否为另一字符串旋转后的解决方案。
摘要由CSDN通过智能技术生成

杨氏矩阵

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

要求:时间复杂度小于O(n)

解题思路

这是一个杨氏矩阵:

查找一个数在矩阵中是否存在,当然映入脑海的,是遍历数组,当然这不失为一种方法,而这道题有一个要求:时间复杂度小于O(n) 显然遍历数组这种方法已经超过了要求的时间复杂度,所以只能另辟蹊径。

细读题目,发现有个条件:矩阵的每行从左到右是递增的,矩阵从上到下是递增的。那是否可以通过这个条件找到一种方法使得时间复杂度达到题目要求呢?

下面是我的具体思路

仔细看我们发现,一行中最右边的数是一行中最大的,一列中最小的,利用这个特点,我们就可以减少查找次数。举个例子,我们要找数字7,我们只需判断3是否比7大,那当然否,那么3的左边不可能有比3大的数字,我们往下找,找到6,判断是否比7大,那当然否,那么6的左边就不肯有比6大的字,然后再往下找,找到9,9比7大,所以9的左边可能存在数字7,然后一直往左边找,直到越界了还没找到那就是不存在。

(当然从左下角开始找也可以,过程和从右上角开始找大差不差,我就不过多赘述)

代码实现

字符串左旋

实现一个函数,可以左旋字符串中的k个字符。

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

方法一:拼接法

解题思路

新开辟一份空间,将需要左旋的字符后面的复制到新开辟的空间,然后再将前面的字符拼接到新开辟的空间。

代码实现

方法一的时间复杂度为O(n),但是新开辟了空间

运行结果:

方法二:逐个左旋法

解题思路

设计循环使其可以旋1次,然后让他执行n次。创建一个临时变量储存首元素,然后将后面的元素逐个左旋,最后将临时变量放到数组最后为左旋一次。

代码实现

方法二虽然没有新开辟空间,但是时间复杂度为o(n^n),方法太繁杂.

运行结果:

方法三:巧妙的三次逆序法

解题思路

例如ABCD,左旋2次后变成CDAB,有一个特殊的操作方式:

先将要左旋的前两个字符逆序(BACD),然后将后半段也逆序(BADC),最后整体逆序(CDAB)即可。我们可以写一个函数帮我们完成逆序

代码实现

这种方法既不需要开辟新的空间,时间复杂度也为o(n)。

运行结果:

字符串旋转结果:

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 =AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

方法一:逐个旋转加判断

解题思路

根据上一题逐个左旋法的思路,在左旋一次后加入判断是否相等即可

代码实现

运行结果:

方法二:重复加库函数法

解题思路

所谓重复法就是将不被旋转的字符串自己拼接自己,例如AABCD,重复之后为AABCDAABCD。然后判断需要查找的BCDAA是否为重复之后的子字符串。所谓子字符串就是在AABCDAABCD中的部分字符串。显然BCDAA为AABCDAABCD的子字符串。

代码实现:

运行结果:

注释:本人新手,如有更优解,欢迎在评论区指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步亿丢丢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值