面趣 | 这道微软面试题你会吗?


640?wx_fmt=jpeg

参加 2018 AI开发者大会,请点击 ↑↑↑


面试题目:


两个单词如果包含相同的字母,次序不同,则称为字母易位词(anagram)。例如,“silent”和“listen”是字母易位词,而“apple”和“aplee”不是易位词。请定义函数检查两个单词是否是字母易位词。可以假设两个单词字母均为小写。要求算法复杂度尽量低。


看到这个题目,你的思路是什么?


思路一

首先,最基本的思路,便是检测字符串s1中的字符是否都出现在s2中(在s1和s2长度一样的前提下)。为了解决“apple”和“aplee”不是易位词的这种情况,不能仅仅判断出现在s2中就可以了,还需要做个标记。这里可以考虑将字符串转换为list,对于比较过的便设置为None。算法代码设计如下:

def anagramSolution1(s1,s2):

   if len(s1) != len(s2):
       return False

   alist = list(s2)

   pos1 = 0
   stillOK = True

   while pos1 < len(s1) and stillOK:
       pos2 = 0
       found = False
       while pos2 < len(alist) and not found:
           if s1[pos1] == alist[pos2]:
               found = True
           else:
               pos2 = pos2 + 1

       if found:
           alist[pos2] = None
       else:
           stillOK = False
           break

       pos1 = pos1 + 1

   return stillOK

print(anagramSolution1('abcd','dcba'))

让我们考虑一下算法复杂度。可以从字符串s2来考虑,对于s2中的每个元素,s1都会从头开始进行遍历一次,所以算法的复杂度为:

640?wx_fmt=png

即算法的复杂度为O(n^2)。


还有没有算法更简单一点的呢?


思路二

通过题目,我们可以想到,字母易位词即为各个字母的数目相同,而顺序不一致。因而,如果对字符串按照字母顺序排序后,那么两个字符串应该完全一致。这样算法复杂度是否更低?


先看一下代码实现如下:

def anagramSolution2(s1,s2):

   if len(s1) != len(s2):
       return False

   alist1 = list(s1)
   alist2 = list(s2)

   alist1.sort()
   alist2.sort()

   pos = 0
   matches = True

   while pos < len(s1) and matches:
       if alist1[pos]==alist2[pos]:
           pos = pos + 1
       else:
           matches = False
           break

   return matches

print(anagramSolution2('abcde','edcba'))

这样算法复杂度是否是O(n)了呢?因为仅仅进行了n次比较啊。当然不是,为什么呢?因为事先先对两个字符串进行了排序,而排序的复杂度并未计入。所以,此种算法的复杂度即为O(n*logn+n),为O(n*logn)。复杂度比思路一的复杂度降低了。

有没有复杂度更低的算法呢?


思路三

思路二利用了字母易位词即为各个字母的数目相同,而顺序不一致。我们从另外一个角度思考,字母一共有多少个?很明显,只有26个(只考虑小写字母)。那么,我们可以为字符串s1和s2分别设置26个计数器,然后判断这对应位置的计数是否相等,如果对应计数完全相等,则为字母易位词。算法代码实现如下:

def anagramSolution3(s1,s2):
   c1 = [0]*26
   c2 = [0]*26

   for i in range(len(s1)):
       pos = ord(s1[i])-ord('a')
       c1[pos] = c1[pos] + 1

   for i in range(len(s2)):
       pos = ord(s2[i])-ord('a')
       c2[pos] = c2[pos] + 1

   j = 0
   stillOK = True
   while j<26 and stillOK:
       if c1[j]==c2[j]:
           j = j + 1
       else:
           stillOK = False
           break

   return stillOK

print(anagramSolution3('apple','plepa'))

算法的复杂度为O(n + n + 26) ,即为O(n),为线性复杂度的算法。


你还有木有其他思路呢?一起聊聊吧~~

1.微信群:

添加小编微信:tangguoyemeng,备注“进群+姓名+公司职位”即可,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


2.征稿:

投稿邮箱:lijy@csdn.net;微信号:tangguoyemeng。请备注投稿+姓名+公司职位。


推荐阅读


  • 为什么阿里飞猪、滴滴、携程都被质疑滥用大数据杀熟?

  • 程序员入错行怎么办?

  • 我们研究了1.5万场活动,换个大城市生活可能对你有用

  • 大数据揭秘: 原来单身女生有这些特点...

  • 放弃培训班自学编程,9 个月后我成为年薪 6 位数的软件工程师

  • 82岁的北大教授证明了黎曼猜想?

  • 继承变量覆盖及构造函数失配,竟然会导致这些漏洞

  • 35岁IT老兵,转型AI,我做错了吗?

640?wx_fmt=jpeg


↓↓↓  点击【阅读原文】查看「CSDN云计算」往期精彩内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BugkuCTF-MISC题baby_flag.txt

下载附件得到一个压缩包baby_flag.zip 打开得到baby_flag.txt&#xff0c;直接点击打开发现乱码 通过010editor打开观察发现这是一个图片文件 将文件后缀改为.jpeg得到一张图片 通过binwalk -e …未分离出有价值的信息 在010editor发现有RAR压缩包的头 将这一部分数据复制…

云漫圈 | 计数排序,你真的了解么?

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑————— 第二天 —————————————————假定20个随机整数的值如下&#xff1a;9&#xff0c;3&#xff0c;5&#xff0c;4&#xff0c;9&#xff0c;1&#xff0c;2&#xff0c;7&#xff0c;8&#xff0c;1&…

BugkuCTF-MISC题blind_injection

下载附件 方法一&#xff1a; 下载用wireshark打开 题目说的是盲注&#xff0c;而注入一般都是走的http&#xff0c;直接导出http对象&#xff0c;再根据大小排序 得到flag 方法二&#xff1a; 若HTTP对象列表点击大小无反应 将其导出&#xff0c;命名为output 在文件夹里查…

ubuntu服务器ssh登录密码修改,Ubuntu-18.04 下修改root用户密码,安装SSH服务,允许root用户远程登录,安装vsftp服务器...

修改root用户密码打开终端&#xff0c;输入 sudo passwd root 指令&#xff1a;安装SSH服务ssh默认端口号是22&#xff0c;可以在/etc/ssh/sshd_config文件中修改查看服务器否开启&#xff1a;netstat -tlp启动服务&#xff1a;sudo /etc/init.d/ssh start重启服务&#xff1a;…

Python json模块 - Python零基础入门教程

目录 一.前言二.python json 模块常用函数三.json 转 Python 字典 dict四.Python 字典 dict 转 json五.关于 json.dump 和 json.load六.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.前言 JSON 的全称是 JavaScript Object Notation&…

Cloud一分钟 | 英国发布大规模遗传数据;德国电信与华为联合发布PLAS云连接服务...

Hello&#xff0c;everyone&#xff1a;10月15日早&#xff0c;星期一&#xff0c;祝大家工作愉快&#xff01;一分钟新闻时间&#xff1a;★ 百度云与智慧农业的头部企业强强联合&#xff0c;共建ABC智能农业生态。★ 德国电信与华为联合发布PLAS云连接服务。★ 英国发布大规模…

“汉堡+奶昔”怎么就成了精致生活的热门标签?

图片来源&#xff1a;视觉中国文章来源&#xff1a;DT财经“左手汉堡&#xff0c;右手奶昔&#xff0c;这是新天地Coco的时髦新日常。最近沪上刮起一阵打卡新风潮&#xff0c;汉堡竟然成了标记城市美好生活的一大利器。还在纠结晚餐去金拱门还是汉堡王的DT君&#xff0c;发现自…

揭开互联网公司的神秘面纱,数据解读那些slay整个行业的互联网公司

前言&#xff1a;随着互联网行业的日益兴盛&#xff0c;吸引力越来越多的牛人加入其中&#xff0c;也有许多小伙伴跃跃欲试&#xff0c;想要在互联网的浪潮中大展身手。今天我们通过看准网的数据&#xff0c;帮助大家对各大互联网公司有一个比较概括的了解。01.数据来源看准网提…

Cloud一分钟 | Gartner发布2018年第二季度全球服务器市场报告;中信银行联合腾讯云推出手机银行智能语音产品...

Hello&#xff0c;everyone&#xff1a;10月16日早&#xff0c;星期二&#xff0c;祝大家工作愉快&#xff01;一分钟新闻时间&#xff1a;完1.微信群&#xff1a;添加小编微信&#xff1a;tangguoyemeng&#xff0c;备注“进群姓名公司职位”即可&#xff0c;加入【云计算学习…

Cloud一分钟 | 华为云发布云数据安全白皮书;OPPO携手阿里云举行天池OGeek算法挑战赛...

Hello&#xff0c;everyone&#xff1a;10月17日早&#xff0c;星期三&#xff0c;祝大家工作愉快&#xff01;一分钟新闻时间&#xff1a;完1.微信群&#xff1a;添加小编微信&#xff1a;tangguoyemeng&#xff0c;备注“进群姓名公司职位”即可&#xff0c;加入【云计算学习…

关于这道填空题,你会如何回答?(附带学习链接)

曾经有一篇百万阅读量的爆文&#xff0c;里面出了道填空题&#xff0c;问&#xff1a;____是铜牌&#xff0c;____是银牌&#xff0c;____是金牌&#xff0c;____是王牌。小白的答案是&#xff1a;Java是铜牌&#xff0c;Linux是银牌&#xff0c;Hadoop是金牌&#xff0c;大数据…

BugkuCTF-Crypto题affine

题目描述&#xff1a; 这题考的是仿射密码&#xff0c;了解一下仿射密码 仿射密码为一类替换密码。它是一个字母对一个字母的。它的加密函数为 其a和m互质&#xff0c;m为字母的数目。 解码函数为 其a^-1为a在Zm群的乘法逆元 乘法逆元&#xff1a; 所有与26互素元素的乘法…

Python set集合 - Python零基础入门教程

目录 一.set 集合简介二.set 集合常用函数三.set 集合运算符四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python 变量中除了以前文章所提到的整形 int / 浮点数 float / 布尔值 bool / 列表 list / 字典 dict 之外&#xff0c;还有…

Cloud一分钟 | 华为云、腾讯云、阿里云中标「央视2018年租赁公有云服务」项目...

Hello&#xff0c;everyone&#xff1a;10月18日早&#xff0c;星期四&#xff0c;祝大家工作愉快&#xff01;一分钟新闻时间&#xff1a;完1.微信群&#xff1a;添加小编微信&#xff1a;tangguoyemeng&#xff0c;备注“进群姓名公司职位”即可&#xff0c;加入【云计算学习…

Cloud一分钟 | 华云数据中标上药控股私有云千万级项目; 总投资90亿元的中国移动厦门数据中心,一期电源工程项目候选人公示...

Hello&#xff0c;everyone&#xff1a;10月19日早&#xff0c;星期五&#xff0c;祝大家工作愉快&#xff01;一分钟新闻时间&#xff1a;完1.微信群&#xff1a;添加小编微信&#xff1a;tangguoyemeng&#xff0c;备注“进群姓名公司职位”即可&#xff0c;加入【云计算学习…

Python set list dict tuple 区别和相互转换 - Python零基础入门教程

目录 一.前言二.Python set list dict tuple 区别三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.前言 Python 提供多种数据类型来存放数据项集合&#xff0c;主要包括序列&#xff08;列表 list 和元组 tuple&#xff09;&#xff…

2023RT-Thread开发者大会

参加了一次RT-Thread的开发者大会&#xff0c;相当有意思&#xff0c;虽然一天奔波挺累&#xff0c;但睡了半天之后简单剪了下22号的视频&#xff0c;也就有时间写自己的参会笔记了。 与openEuler社区不同&#xff0c;RT-Thread社区更专注于嵌入式&#xff0c;与硬件厂商结合较…

企业大咖教你解决Kubernetes的挑战

Kubernetes&#xff08;K8s&#xff09;是自动化容器操作的开源平台&#xff0c;这些操作包括部署&#xff0c;调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器&#xff0c;那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes还可以提供容器弹性&am…

Android 之父裁员 30%:开发者如何避免“被离职”?

近几个月来&#xff0c;Google 和 Android 都不太太平。从 7 月 Google 被欧盟处以 50 亿美元的反垄断罚款&#xff0c;到引起恐慌的 Android 碎片化漏洞&#xff0c;再到 Android 的许可政策遭遇更改......而现在&#xff0c;由 Android 之父一手创立的初创公司也惨遭“滑铁卢…

面趣 | 据说这道烧脑的微软面试题很奇葩,你来试试?

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑问面试题目&#xff1a;昨天&#xff0c;我早上8点爬山&#xff0c;晚上8点到山顶。睡了一觉后&#xff0c;今天&#xff0c;我早上8点从山顶原路下山&#xff0c;晚上8点到山脚。请问&#xff0c;有没有一个时刻&#xff0c;昨…