一道微软面试时碰到的,经典的,关于字符串操作的面试题目

面试困惑问与答(2)——感觉挺好,为啥被拒了? 问:技术面试的时候,题目挺简单的,我觉得自己都做出来了。可最后怎么还是被拒了啊? 答:面试被拒有很多种可能,比如面试官认为你性格不适合、态度不够诚恳等等。但在技术面试过程中,这些都不是最重要的。技术面试的面试官一般都是程序员,程序员通常没有那么多花花肠子,他们只认一个理:题目做 阅读详情

第一次被微软的人面试就被面了一个好题目,好在自己答上了,现在show一下,和大家分享一下。

题目:写一个函数给它三个字符串作为参数,它们分别是str1,str2,str3, 让函数返回在str1中以str2开头,str3结尾的字符串,并写出测试用例。

 

2.   public static List<string> FindSubString(string str1, string str2, string str3)

3.           {

4.               if (str1.IndexOf(str2) == -1 || str1.IndexOf(str3) == -1)

5.               {

                    //str1中不包含str2或者str3.

6.                   throw new ArgumentException("The start string or the end string does not exist in str1.");

7.               }

               //搜索并记录str1中str2的位置

8.               List<int> startPos = new List<int>();

9.               int searchPos = 0;

10.              while (searchPos != -1)

11.              {

12.                  searchPos = str1.IndexOf(str2,searchPos);

13.                  if (searchPos != -1)

14.                  {

15.                      startPos.Add(searchPos); 

16.                  }

17.                  else

18.                  {

19.                      break;

20.                  }

21.                  searchPos++;

22.                 

23.              }

               //搜索并记录str1中str3的位置

24.              List<int> endPos = new List<int>();

25.              searchPos=0;

26.              while (searchPos != -1)

27.              {

28.                  searchPos = str1.IndexOf(str3,searchPos);

29.                  if (searchPos != -1)

30.                  {

31.                      endPos.Add(searchPos);  

32.                  }

33.                  else

34.                  {

35.                      break;

36.                  }

37.                  searchPos++;

38.                  

39.              }

                //通过str2和str3的位置来找处以str2开头,以str3结尾的字符串

40.              List<string> r = new List<string>();

                //str2的位置从头扫描

41.              foreach (int s in startPos)

42.              {

43.                  int[] e = endPos.ToArray();

                    //str3的位置从尾部扫描

44.                  for (int i = e.Length - 1; i >= 0; i--)

45.                  { 

                        //如果str2的位置+它的长度 〈= str3的位置+它的长度:表明str2没有把str3包含再它里面,是我们想要的字符串。 

46.                      if (s <= e[i] && s+str2.Length <= e[i]+str3.Length)

47.                      {

48.                          string temp = str1.Substring(s, e[i]-s+str3.Length);

49.                          if (!r.Contains(temp))

50.                          {

                                //结果字符串的集合内没有包含这个字符串再把它加入。

51.                              r.Add(temp);

52.                          }

53.                      }

54.                      else

55.                      {

56.                          break;

57.                      }

58.                  }

59.              }

60.              return r;

     }

原以为这个程序ok了,后来发现还是有许多defect的,不过思想是对的,但原来的程序没有对str1,str2和str3为null的情况的考虑,以及str2,str3为string.Empty的考虑,还有一个问题就把最后的字符串添加到list中,用list.Contains去判断,这样他的时间复杂度是O(n),整个程序的时间复杂度就是O(n*n*n),我们可以用Diectory去替换,最后的时间复杂度就是O(n*n),下面是这个程序的改进版本:

        public static List<string> FindSubString(string str1, string str2, string str3)

        {

            if(str1 == null ||str2==null ||str3==null)

            {

                throw new NullReferenceException("str1 str2 and str3 can not be null!");

            }

            if(str2.Length > str1.Length || str3.Length > str1.Length)

            {

                throw new ArgumentOutOfRangeException("str1 is not long enough!");

            }

            List<string> result = new List<string>();

            if (str2 ==string.Empty && str3 !=string.Empty)

            {

                if (str1.IndexOf(str3) != -1)

                {

                    result.Add(str3);

                }

                return result;

            }

            if ((str3 == string.Empty && str2 != string.Empty) || str2 == str3)

            {

                if (str1.IndexOf(str2) != -1)

                {

                    result.Add(str2);

                }

                return result;

            }

            Dictionary<string,string> resultDic = new Dictionary<string,string>();

            // require two integer list to store the position where the str2 and str3 in str1.

            List<int> str2Pos = new List<int>();

            List<int> str3Pos = new List<int>();

            //find position of str2 and str3 in str1.

            int pos = -1;

            do

            {

                pos = str1.IndexOf(str2, pos + 1);

                if (pos != -1)

                {

                    str2Pos.Add(pos);

                }

            } while (pos != -1);

            do

            {

                pos = str1.IndexOf(str3, pos + 1);

                if (pos != -1)

                {

                    str3Pos.Add(pos);

                }

            } while (pos != -1);

            for (int i = 0; i < str2Pos.Count; ++i)

            {

                for (int j = str3Pos.Count - 1; j >= 0; --j)

                {

                    if (str2Pos[i] <= str3Pos[j])

                    {

                        //str2 doesn't contains str3

                        if (str3Pos[j] + str3.Length >= str2Pos[i] + str2.Length)

                        {

                            string item =str1.Substring(str2Pos[i], str3Pos[j] + str3.Length-str2Pos[i]);

                            if(!resultDic.ContainsKey(item))

                            {

                                 resultDic.Add(item,item);

                            }

                        }

                    }

                    else

                    {

                        break;

                    }

                }

            }

            return resultDic.Keys.ToList();

        } 

 

微软亚洲研究院经典面试题 收集了几年来微软亚洲研究院计算机专业面试题,其中的算法之精巧让你十分陶醉 希望提高你编程水平 立即下载

相关推荐

微软面试题解析与答案 - 微软(Microsoft)

微软2012年的面试解析与答案,很详细。

微软亚洲研究院的一道面试题

alexingcool的专栏 1873

进阶数据结构——链式前向星

链式前向星是一种进阶的数据结构,主要用于图的存储。我希望大家先看这个视频(蓝色字体点进去) 不然你很难理解的。在图论中,图的存储方式主要有邻接矩阵和邻接表两种。邻接矩阵虽然建图简单方便,但占内存较大,节点数量稍微大点的题目就难以使用(适合稠密图);而邻接表虽然节省空间,但其指针形式难写易错,且vector形式的读取速度较慢,易导致大数据下的超时(TLE)。针对上述问题,链式前向星作为一种折中的方式应运而生。链式前向星本质上是一种静态链表,它将数据以链表形式连接在一起。

ycs66的博客 2137

微软的面试题及答案-超变态但是很经典

转载: 第一组   1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?   2.你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻?   3.如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀,问你如何才...

liyanhui 2025

统计信号处理基础 习题解答1-1

1-1:在雷达习题中,双程延时时间的估计量具有PDF τ0~Nτ0,στ02,其中τ0是真值。假如要估计距离请提出一种估计量R,并求它的PDF。然后,确定标准偏差στ0,使得距离估计值的99%在真值的100m以内,对电磁波传播速度取c=3×108m/s。 解答: 问题1: 由于电磁波传播速度c,信号可观察的双程传播延时τ0和双程传播距离τ0满足关系: R=cτ02 因此可采用如下估计量: R=cτ02 问题2: 由于τ0满足正态分布,且: Eτ0=τ0 varτ0=στ02 那么: E

weixin_43270276的博客 2806

EMD (经验模态分解) 在 C++ 中的实现指南

EMD 是由 Norden E. Huang 等人在1998年提出的一种适用于非线性和非平稳信号的分析方法。对称性:IMF 的上下包络对称。零交叉点:IMF 的零交叉点数量与极值点数量相同或相差一个。本文详细介绍了如何在C++中实现EMD,包括理论背景、算法步骤、代码实现和优化等内容。通过丰富的代码示例和详细的解释,希望能够帮助读者掌握EMD的基本原理,并能够在实际项目中灵活应用。未来,随着信号处理技术的不断发展,EMD及其变种(如EEMD、CEEMDAN等)将继续在各个领域发挥重要作用。

qq_38334677的博客 1749

微软研发类实习生面试

自己一直对微软有一种对bat没有的向往吧!所以很早就关注了微软的实习生招聘。 想成为微软的intern必须经过以下环节 笔试+一轮电话面试+3轮现场面试(中间可能穿插着跟hr谈谈) 1 笔试 先说一下微软的笔试,微软所有的实习生都是必须参加笔试的无论是不是技术研发类的(只是笔试通过要求的分不一样而已),笔试就是4道acm题目,在我博客之前的文章中可以看到这四道题目,思维难道不大,但是在要求的

martinmateng的博客 1万+

【北大核心-代码复现】基于 VMD-FFCM-iTransformer 光伏功率短期预测

【北大核心-代码复现】基于 VMD-FFCM-iTransformer 光伏功率短期预测

766

一个程序员的面试经历(二)_Microsoft面试

  昨天(星期天)终于收到了Microsoft的正式offer,难道周末经常需要加班吗?!今天立刻跑去签了,心头的大石也终于落下来了!回忆一下Microsoft的面试经历吧!第一天:9:00 40分钟的笔试题目10:00 第一轮面试11:00 第二轮面试12:00 第三轮面试第二天1小时的最后面试第一天总共有7个人,面试时都是1对1的方式,每次面试的结果会立刻汇报,所以不断有人

ecai的专栏 4903

【报错】(pycharm运行程序)OSError: [WinError 1114] 动态链接库(DLL)初始化例程失败。 Error loading

1 报错 OSError: [WinError 1114] 动态链接库(DLL)初始化例程失败。 Error loading 2 分析原因 通过 activate Distance 进行自己创建的 Distance 虚拟环境中,输入python会显示环境中python的版本信息,再依次import,显然不会报错。 这是因为在Anaconda的环境下有支持 import torch 的 dll,而在PyCharm中使用的是自己创建的新环境,还缺少相应支持的dll,仅需在PyCharm中配置环境变量。.

静谧、淡雅 8623

LAMMPS后处理—如何构建二维云图-接触角呢?

计算接触角

Rockyoung 6523

编程之美——微软技术面试心得

内容介绍:《编 程之美——微软技术面试心得》是微软亚洲研究院技术创新组研发主管邹欣老师继《移山之道——VSTS软件开发指南》后的最新力作。他带领其他几位同事和实 习生经过9个月的时间完成了这本书。本书收集了大约60道微软技术面试题,这些问题妙趣横生,其解答别出心裁,还穿插了面试者的各种小故事。它传达给读 者:微软重视什么

phphot 3248

OpenClaw终于有了图形界面,一键安装使用你的24小时AI 研究助手!

ClawX是连接强大 AI 智能体与普通用户之间的桥梁。基于OpenClaw构建,它将命令行式的 AI 编排转变为易用、美观的桌面体验——无需使用终端。无论是自动化工作流、连接通讯软件,还是调度智能定时任务,ClawX 都能提供高效易用的图形界面,帮助你充分发挥 AI 智能体的能力。ClawX 预置了最佳实践的模型供应商配置,原生支持 Windows 平台以及多语言设置。当然,你也可以通过设置 → 高级 → 开发者模式来进行精细的高级配置。

Maynor的博客 3392

全新整理:微软、Google等公司的面试题及解答、第161-170题

全新整理:微软、Google等公司非常好的面试题及解答、第161-170题整理:July。时间:二零一一年四月十日。微博:http://weibo.com/julyweibo。出处:http://blog.youkuaiyun.com/v_JULY_v。------------------------------- 引言    此微软100题V0.2版的前60题,请见这:微软、谷歌、百度等公司经典面试100题

结构之法 算法之道 6万+

YOLO26训练教程,训练自己的数据集教学,从源码下载,配置虚拟环境,准备数据集、训练、验证、推理测试 。实现0到1的完整教学过程。快速入门必看

本文详细介绍了YOLO26目标检测模型的配置与使用流程:1)下载YOLOv11源码并创建Python3.10虚拟环境;2)安装PyTorch2.5.1及相关依赖库;3)准备数据集并修改配置文件;4)编写训练脚本设置参数(640x640分辨率、500轮次);5)验证模型效果;6)使用训练好的模型进行推理测试;7)生成可视化热力图。整个过程涵盖了从环境搭建到模型应用的全流程,并提供了清华镜像源加速下载。

Ai缝合怪、助力小伙伴高效发论文 5286

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

围观了今年的微软面试,原来这才叫史诗级放水…

最近听说苏州微软疯狂扩招,所以我们深扒了下微软的面经,发现还真有点东西... 比如这道一年的第N天,有同学反馈说跪在了这道简单题的最优解上。 其他算法题的涉及知识点也很广,像LRU缓存策略,带最小值操作的栈,外星人字典,重排列表 , 前K个高频元素。包含了哈希,链表,栈,宽度优先搜索,贪心,堆等考点。 虽然面试难度没有降低,但他确依旧是目前性价比最高的大厂,有了疯狂扩招加持,可以称之为【史诗级...

九章算法的博客 1141

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

微软面试题及答案

微软面试题及答案一.最基本題型(說明:此類題型比較簡單) 1.燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如 何用燒繩的方法來計時一個小時十五分鐘呢? 2.你有一桶果凍,其中有黃色、綠色、紅色三種,閉上眼睛抓取同種顏色的兩個。抓取多少 個就可以確定你肯定有兩個同一顏色的果凍?(5秒-1分鐘) 3.如果你有無窮多的水,一個3公升的提捅,一個5公升的

bluedusk 1445

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

应聘微软失败记

应聘微软失败记----------------------------------暑假前应聘微软MSN开发组,公司外派形式的,知春路非常温馨一家小公司,感觉非常好。虽然不是微软正式员工,但是只要是能进微软工作就知足啦,更何况这是与MSN开发组的人在一块工作呢。小公司的面试通过啦,说微软的面试难度跟这个也差不多,7月里微软要来人培训说一说面试要点,然后要参加微软的面试。我别提多高兴啦,竟然有可以

太极语言 6650

笔试面试题

此微软100题V0.2版的前60题,请见这:微软、谷歌、百度等公司经典面试100题[第1-60题]。关于本人整理微软100题的一切详情,请参见这:横空出世,席卷Csdn [评微软等数据结构+算法面试100题]。 声明 1、下面的题目来不及一一细看,答案大部是摘自网...

chuifuhuo6864的博客 299

微软、Google等公司的面试题及解答、第161-170题

全新整理:微软、Google等公司非常好的面试题及解答、第161-170题 整理:July。 时间:二零一一年四月十日。 微博:http://weibo.com/julyweibo。 出处:http://blog.youkuaiyun.com/v_JULY_v。 -------------------------------   引言     此微软100题V0.2版的前60题

宇宙浪子的专栏 1365

微软的面试题(超变态但是很经典)

为什么80%的码农都做不了架构师?>>> ...

weixin_34289744的博客 109

全新整理:微软、Google等公司的面试题及解答、第61-70题

全新整理:微软、Google等公司非常好的面试题及解答、第61-70题 整理:July。时间:二零一一年四月十日。微博:http://weibo.com/julyweibo。出处:http://blog.youkuaiyun.com/v_JULY_v。------------------------------- 引言 此微软100题V0.2版的前60题,请见这:微软...

weixin_30498921的博客 269
上一篇: 自己整理的快速排序算法
下一篇: 《Software Testing》笔记(ch9:Standard and Guidelines ch10:Foreign-language Testing)
zfsCSD
博客等级 码龄17年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值