一些较为复杂的字符串处理(C/C++)

目录

1.螺旋打印
2.键盘重复
3.字符串中有几个相同单词
4.待更新…
第一题:
思路:
设置四个边界:up,down,left,right.然后在每次循环后改变其值,并进行判断是否越界,如果越界,则终止循环。

int main(){
    int n;
    scanf("%d",&n);

    int num = 1;
    int up = 0,down = n-1,left = 0,right = n-1;
    while(true){
        for(int i = left;i<=right;++i ){
            ans[up][i] = num++;
        }
        ++up;//因为向下逼近。所以增大up
        if(up>down) break;
        for(int i = up;i<=down;++i ){
            ans[i][right] = num++;
        }
        --right;//因为向左逼近。所以减小right
        if(left>right) break;
        for(int i = right;i>=left;--i ){
            ans[down][i] = num++;
        }
        --down;//因为向shang逼近。所以减小down
        if(down<up) break;
        for(int i = down;i>=up;--i ){
            ans[i][left] = num++;
        }
        ++left;//因为向shang逼近。所以增大left
        if(right<left) break;
        
    }
    for(int i = 0;i<n;++i){
        for(int j = 0;j<n;++j){
            cout<<ans[i][j];
        }
        cout<<endl;
    }

    return 0;
}

第二题:
题目来源有点忘了(哈哈)
大概题目:
有一个字符串比如1111aaaadd333f3。键盘坏了,因此会输出多个字母,让你输出原先的正确序列,按照题意,应该输出1add333f。因为最后有一个单独的3,因此说3这个键是没坏的。

string s;
int num;
bool hashtable[128]={false};
int len = s.length();
for(int i = 0;i<len-1;++i){
   if(str[i]==str[i+1]){
       int j = i;
       num = 1;
       while(j+1<len&&s[j]==s[j+1]){
          num++;
          if(num>=n)//超过n认为可能出现错误;
          {
             hashtable[s[j]]==true;
          }
       }
   }
   i = j;
}
//下面这个循环用来判断那些键是没坏的,将假的true重新改成false;
forint i= 0;i<len;++i){
    if(hashtable[s[i]]==true){
         int k = i;
         num = 1;
         while(s[k]==s[k+1]){
             ++num;            
         }
         if(num<n) hashtable[s[k]]= false;
    }
    i = k;

}

第三题:
有一串字符can1_ can i have a can can,统计其中出现最多的字符数
思路:从头开始遍历,并用map进行映射统计,对最后留下的一个字符记得要进行处理,这里注意的是读入的时候要用getline,别用cin,因为cin遇到空格会结束。

int main(){
    string s;
    getline(cin,s);
    int i = 0;
    string word = "";
    while(i<s.length()){
        if(s[i]==' '){
            if(word!=""){
                if(ans.find(word)!=ans.end()){
                    ans[word]++;
                }else{
                    ans[word] = 1;
                }
                word = "";
            }
        }else{
        word+=s[i];
        }
        ++i;
    }
    if(word!=""){
         if(ans.find(word)!=ans.end()){
                    ans[word]++;
                }else{
                    ans[word] = 1;
                }
    }
    int Max = -1; 
    for(map<string,int>::iterator it = ans.begin();it!=ans.end();++it){
        if(it->second>Max){
            word = it->first;
            Max = it->second;
        }
    }
    printf("%s\n",word.c_str());
    cout<<ans[word];
    return 0;
}
发布了3 篇原创文章 · 获赞 0 · 访问量 286

猜你喜欢

转载自blog.csdn.net/weixin_44879587/article/details/105042162