• 程序员面试经典--字符串


    字符串切割函数汇总。

    http://www.cnblogs.com/MikeZhang/archive/2012/03/24/MySplitFunCPP.html

    1题目描述

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

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

    测试样例:
    "aeiou"
    返回:True
    "BarackObama"
    返回:False

    1.利用map做
    class Different {
    public:
        bool checkDifferent(string iniString) {
            // write code here
    
            map<char, int>a;
            int i;
            for (i = 0; i<iniString.size(); i++){
                a[iniString[i]]++;
            }
            for (auto it = a.begin(); it!=a.end(); it++){
                if (it->second>1)
                    return false;
            }
            return true;
        }
    };
    View Code

    2题目描述

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

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

    测试样例:
    "This is nowcoder"
    返回:"redocwon si sihT"
    对调字符串。
    class Reverse {
    public:
        string reverseString(string iniString) {
            // write code here
            int len = iniString.size();
    
            int ch;
            for(int i=0;i<len/2;i++){
                ch = iniString[i];
                iniString[i] = iniString[len-i-1];
                iniString[len-i-1] = ch;
            }
            return iniString;
        }
    };
    View Code

    3题目描述

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

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

    测试样例:
    "This is nowcoder","is This nowcoder"
    返回:true
     
    "Here you are","Are you here"
    返回:false

    class Same {
    public:
        bool checkSam(string stringA, string stringB) {
            
            sort(stringA.begin(),stringA.end());
            sort(stringB.begin(),stringB.end());
            return stringA.compare(stringB)==0;
        }
    };
    View Code

    4题目描述

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

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

    测试样例:
    "Mr John Smith”,13
    返回:"Mr%20John%20Smith"
    ”Hello  World”,12
    返回:”Hello%20%20World”
    class Replacement {
    public:
        string replaceSpace(string iniString, int length) {
            // write code here
            string s = "%20";
            int i=0;
            while(iniString[i]!=''){
                if(iniString[i] == ' '){
                    iniString.replace(i, 1, s);//将位置2开始的3个字符(345)换成abcde
                    i = i+2;
                }else{
                   i++;  
                }    
            }
           return iniString;
        }
    };
    View Code

    5题目描述

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

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

    测试样例
    "aabcccccaaa"
    返回:"a2b1c5a3"
     
    "welcometonowcoderrrrr"
    返回:"welcometonowcoderrrrr"
    class Zipper {
        string num2str(double i)
      {
          stringstream ss;
          ss << i;
          return ss.str();
      }
    public:
        string zipString(string iniString) {
            // write code here
            
            int len = iniString.size();
            string s;
            int  n = 0;
            char tmp = iniString[0];
            for(int i=0;i<len;i++){
                if(tmp == iniString[i]){
                    n++;
                }else{
                    s +=tmp;
                    s +=num2str(n);
                    tmp = iniString[i];
                    n=1;
                }
            }
            if(n>0){
                 s +=tmp;
                 s +=num2str(n);
            }
            if(s.size()>=len){
                return iniString;
            }else{
                return s;
            }
        }
    };
    View Code

    6题目描述

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

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

    测试样例:
    "Hello world","worldhello "
    返回:false
    "waterbottle","erbottlewat"
    返回:true
    class ReverseEqual {
    public:
        bool checkReverseEqual(string s1, string s2) {
            // write code here
            if(s1.size()!= s2.size()){
                return false;
            }
            if(s1 == s2)return true;
            int len = s1.size();
            while(len--){
                  char ch = s1[0];
                   s1.erase(0, 1);
                s1.append(1, ch);
                if(s1 == s2){
                    return true;
                }
            }
            return false;
        }
    };
    View Code
  • 相关阅读:
    【原】 POJ 1012 Joseph 约瑟夫 解题报告
    【原】 POJ 1001 Exponentiation 大整数乘法 解题报告
    POJ——1517
    毕业了,校园里走走看看——华中科技大学
    毕业答辩后
    CV编程常用的获取鼠标圈定区域的方法
    送走了GB
    POJ——2546
    奥巴马在YY21#524
    POJ——3517
  • 原文地址:https://www.cnblogs.com/yuguangyuan/p/6116345.html
Copyright © 2020-2023  润新知