程序员面试宝典第一题判断字符串是否相同

题目:

(编程题)

请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。

给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。

测试样例:

"aeiou"返回:True"BarackObama"返回:False

解析:首先需要注意的是,若全部不相同,该字符串最多只有257位,因为为ascii字符

方法1:遍历:双层循环判断可得,按道理为时间复杂度为n2,但其实最多只要判断前257位,所以时间复杂度为o(1)

方法2:排序:首先将全部排序,时间复杂度o(nlogn)快排,遍历一遍来判断,时间复杂度为O(n),和方法一一样,只要判断前257位

方法3:哈希法:对于只要进行查询操作的题目,哈希无疑是一个非常好的选择,时间复杂度为O(1),但这类似于时间换空间,开辟n的数组,此题目要求不能开辟新的空间,所以此方法不适合该题目

方法4:

parition方法:

该方法类似于快速排序,但是是边排序边判断是否重复,使用left,right控制两边,pos为中间元素,时间复杂度为O(nlogn)

快速排序理解请看此处:https://blog.csdn.net/code_AC/article/details/74158681

此下为代码:

bool quick_sort(string &str, int low, int high)
{
    int left = low, right = high;
    char pos = str[left];
    if (low >= high)
        return true;
    while (left < right)
    {
        while (pos <str[right] && left < right)
        {
            right--;
        }
        str[left] = str[right];
        while (left<right&&pos>str[left])
        {
            left++;
        }
        str[right] = str[left];
    }
    str[left] = pos;//两种情况都是最终可以变成这样
    //此时left和right都在一个位置
    //判断该点是否重复(相等的情况)
    if (left > low&&str[left] == str[left - 1])
    {
        return false;
    }
    if (right < high&&str[right] == str[right + 1])
    {
        return false;
    }
    return quick_sort(str,low, left - 1) &&quick_sort(str, left+1,high);
}
bool check_difference(string str)
{
    int length = str.size();
    return quick_sort(str, 0, length - 1);
}

以上代码未实际测试过,如有错误,请指出

原文地址:https://www.cnblogs.com/CarrollTM/p/10516051.html

时间: 2024-11-07 02:28:06

程序员面试宝典第一题判断字符串是否相同的相关文章

《PHP程序员面试笔试真题解析》——新书上线

你好,是我--琉忆.很高兴可以跟你分享我的新书. 很高兴,在出版了PHP程序员面试笔试宝典后迎来了我的第二本书出版--<PHP程序员面试笔试真题解析>. 如果你是一个热爱PHP的程序员,刚踏入PHP职场,你值得拥有这本书来自学一番,再去尝试找PHP相关的工作,对你帮助绝对不是一般的大!! PS:宝典和真题解析其实是一套的~ 以下简单的对我的新书做个介绍~ 前言 本书的适用群体:刚接触PHP,自学一段时间PHP后打算去找PHP相关的PHP面试工作的群体.这部分群体可以尝试着去练习这部分企业中经常

C#与.NET程序员面试宝典

题目虽然有点多,但是都是最常见的面试题.如果大家准备参加相关的面试,最好看看.尤其最后的几十个跨国公司面试题.现在国内很多企业都开始学习这套方式,来为难大家.有准备,就容易成功. 即使大家今年不打算找工作,也可以作为一个水平考察,看看自己到底可以应对多少. 面试题1  介绍ASP.NET 答:asp.net是建立在通用语言运行库的程序架构,通过asp.net可以开发出非常强大的Web应用程序. 面试题2  介绍ASP.NET和ASP的区别 答:1.ASP.NET支持预编译. 2.ASP.NET拥

《Java程序员面试宝典》学习笔记(基本语法部分)

这是我学习欧立奇<Java程序员面试宝典>第三版的笔记.这篇是基本语法部分. ClassLoader主要对类的请求提供服务,当JVM需要某类时,它根据名称向ClassLoader要求这个类,然后由ClassLoader返回这个类的class对象. 在Java中,字符只以一种形式存在,那就是Unicode.在JVM内部一切都由Unicode表示,而输出到外部后(JVM和OS的交界处就是各种输入/输出流)转换为其他形式的编码. Java用了中间缓存变量的机制,所以,j=j++可换成如下写法: te

《程序员面试宝典》精华 编程语言部分

<程序员面试宝典>精华 编程语言部分 正所谓取其精华,去其糟粕.本文谨记录下<程序员面试宝典>一些关键的知识点.易错点,对于一些虽然重要但书中没有解释清楚的地方不做记录.当然这里的糟粕只是指不那么重要,或者比较简单,并不是说书写的不好.希望以后回顾时无需再看此书,只看保留在文中的精华即可. 文中有少许bug,亦摘录在此. 本文专注编程语言部分,包括第五章到第九章的内容 第五章 语言细节 5.1 y = z = 5,等号先计算右边,返回值是赋值后的左边的变量值 5.1 printf函

《JAVA 程序员面试宝典(第四版)》读书笔记之前言

工作五年了一直在小的软件公司混,总感觉自己的专业知识没有太大的提升.当然了中间也换了一两家公司,面试的公司就很多家,总感觉正规的软件公司(无论大小)对于基础知识的考核都非常重视,而不管你说你之前服务过什么NB公司,做过什么样NB的项目,上来就先拿一份基础的题目来考核你看一下你的水平.一开始我是排斥的,总感觉考这些东西没有什么用,反正有的东西工作中不一定就用得到,只要自己能够做出东西来就可以了.问题来了怎么样子才算“做出东西”呢?这个问题总感觉很难从理论上来回答,就拿我这几年工作的事情来说吧,在这

C/C++程序员面试易错题

c部分::::::::::::::::::::::::::::::::::: 27. 关键字volatile有什么含意? 并给出三个不同的例子.[参考答案]一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份.下面是volatile变量的几个例子:1). 并行设备的硬件寄存器(如:状态寄存器)2). 一个中断服务子程序中会访问到的非自动变量

C#与.NET程序员面试宝典 Day2

15年底,似乎陷入了困境,老婆上个月工资没发,小房的房租也没收到,我的工资也没发,全都拖着...而且元旦离职后,新的工作还没着落...上次介绍的工作机会只回复了已转人事,春节后可能有个项目会要人...总不能在家等一个月吧,问他能不能先面试,如果通过了,等一个月是可以:如果没通过,也好找工作.还没后续消息... 今天下班碰到一老一少两个女的在电梯口,说是要买4楼的同户型房,是网上看到的司法拍卖,但明天要出差,能不能到我家看一下户型... 刚开始我很犹豫,因为回小区时顺便看了下家里的灯,家里人出去了

程序员面试金典算法题

空格替换 题目描述 请编写一个方法,将字符串中的空格全部替换为"%20".假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成. 给定一个string iniString 为原始的串,以及串的长度 int len, 返回替换后的string. 测试样例: "Mr John Smith",13 返回:"Mr%20John%20Smith" "Hello World&qu

JAVA程序员面试宝典总结-谈谈我的理解吧

2014年9月7日 今天开启阅读了这本书,中断了原计划中算法中级层次的系统性训练,我觉得先看看面试题吧.先给这本书A掉再说. 阅读了一天,大概阅读了一半,有点失望,因为这本书讲解的面试都是基础中的基础,我看着都着急,作者很难深入系统层次的去谈论技术,都是一些表面的文章. 不过我给大家整理了一些比较细节的东西. 第五章开始吧: ----------------------------------------------------- classLoader知识. 整体调用用到的是父类委托.为什么这