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

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_happiness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值