【程序员面试宝典】字符串相关面试题

来源:互联网 发布:淘宝我的提问看不到 编辑:程序博客网 时间:2024/05/21 13:55

1、确定字符互异

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

测试样例:

“aeiou”

返回:True

“BarackObama”

返回:False

bool IsDiffer(string iniString){    if (iniString.size() > 256)        return false;    for (int i = 0; i < iniString.size(); i++)    {        for (int j = i + 1; j < iniString.size(); j++)        {            if (iniString[i] == iniString[j])                return false;        }    }    return true;}

2、原串翻转

请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。

给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的长度小于等于5000。

测试样例:

“This is nowcoder”

返回:”redocwon si sihT”

string reverseString(string iniString) {    if (iniString.size() <= 1)        return iniString;    int left = 0;    int right = iniString.size() - 1;    while (left < right)    {        int tmp = iniString[left];        iniString[left] = iniString[right];        iniString[right] = tmp;        left++;        right--;    }    return iniString;}

3、确定两串乱序重构

给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。

给定一个string stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。

测试样例:

“This is nowcoder”,”is This nowcoder”

返回:true

“Here you are”,”Are you here”

返回:false

bool checkSam(string stringA, string stringB) {    // write code here    if (stringA.empty() || stringB.empty())         return false;    int hashtableA[256] = { 0 };    int hashtableB[256] = { 0 };    for (int i = 0; i<stringA.size(); i++)        hashtableA[stringA[i]]++;    for (int i = 0; i<stringB.size(); i++)        hashtableB[stringB[i]]++;    for (int i = 0; i<256; i++)    if (hashtableA[i] != hashtableB[i])        return false;    return true;}

4、空格替换

请编写一个方法,将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成。

给定一个string iniString 为原始的串,以及串的长度 int len, 返回替换后的string。

测试样例:

“Mr John Smith”,13

返回:”Mr%20John%20Smith”

”Hello World”,12

返回:”Hello%20%20World”

string ReplaseSpace(string iniString, int length){    string newStr = "";    for (int i = 0; i < length; i++)    {        if (iniString[i] == ' ')            newStr +=  "%20";        else            newStr += iniString[i];    }    return newStr;}

5、字符串压缩

利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。

给定一个string iniString为待压缩的串(长度小于等于10000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。

测试样例

“aabcccccaaa”

返回:”a2b1c5a3”

“welcometonowcoderrrrr”

返回:”welcometonowcoderrrrr”

string zipString(string iniString){    string newString;    int len = iniString.size();    int start = 0, end = 0;    int count = 0;    char arr[4] = { 0 };    while (end < len)    {        while (iniString[start] == iniString[end])            end++;        newString += iniString[start];        count = end - start;        newString += to_string(end - start);        //to_string()函数返回bitset的字符串形式。        //bitset除了可以访问指定下标的bit位以外,还可以把它们作为一个整数来进行某些统计        start = end;    }    if (iniString.size() <= newString.size())        return iniString;    else        return newString;}

6、翻转子串

假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。

给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。

测试样例:

“Hello world”,”worldhello “

返回:false

“waterbottle”,”erbottlewat”

返回:true

bool checkReverseEqual(string s1, string s2) {    if (s1.size() != s2.size())        return false;    s1 += s1;    if (s1.find(s2) != string::npos)    //返回str在字符串中第一次出现的位置(从index开始查找)    //如果没找到则返回string::npos,        return true;    return false;}
原创粉丝点击