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

Posted carrolltm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员面试宝典第一题判断字符串是否相同相关的知识,希望对你有一定的参考价值。

题目:

 (编程题)

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

给定一个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);
}

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

 
 
 
 
 
 
 
 
 
 
 
 
 

以上是关于程序员面试宝典第一题判断字符串是否相同的主要内容,如果未能解决你的问题,请参考以下文章

《PHP程序员面试笔试宝典》——如果面试问题曾经遇见过,是否要告知面试官?

栈应用:有效的括号(第一题)

2023年JAVA面试宝典(全网最全未来十年可用)

二维数组的查找——剑指offer第一题

力扣-面试题刷题第一天

Java面试宝典pdf整理