【202002】牛客网“找位置”

题目要求的输入输出格式:
在这里插入图片描述
以下是我的代码(AC):

#include<stdio.h>
#include<string.h>
/*
void pposition(char a[], int left, int right, char c){
    for(int i = left; i < right; i++){
        if(a[i] == c){
            printf("%c:%d,", c, i);
            a[i] = '*';
        }
    }
}
if(str[i] != '*'){
    pposition(str, i + 1, len, str[i]);
}
*/

int main(){
    char str[100] = {0};
    gets(str);
    int len = strlen(str);
    char c = str[0];

    for(int i = 0; i < len; i++){
        if(str[i] != '*') c = str[i];
        int a[100] = {0};
        int n = 0;
        for(int j = i + 1; j < len; j++){
            if(str[j] == c){
                a[n++] = j;
                str[j] = '*';
            }
        }
        if(n != 0){
            printf("%c:%d,", c, i);
            for(int k = 0; k < n; k++){
                printf("%c:%d", c, a[k]);
                if(k != (n-1)) printf(",");
                else printf ("\n");
            }
        }
    }
    return 0;
}

注释的部分:
本来想要写一个函数用来查找在一个字符串中某一个字符出现的所有位置,但是有很多细节问题是这个函数顾及不到的。例如,
1.字符a在下标为0,3,4位置出现时,输出格式为"%c:%d,“但在下标为9处(也就是字符重复的最后一个位置),输出格式为”%c:%d"(把逗号变成了换行符)。这也就意味着需要判断某个位置是否是最后一个重复点
错误示范如下:
在这里插入图片描述
2.当查找字符a在字符串中重复的下标位置时,因为代码最外层嵌套的是一个for循环,所以要注意对于同一个字符a在字符串中的位置查找只需要出现一次就好。
错误示范如:
a:0,a:3,a:4,a:9
a:3,a:4,a:9
a:4,a:9
3.只有当字符在字符串中出现重复时,才对位置进行显示。

基本思想:利用两个for循环,将某字符在其后位置出现重复的下标记录在数组a[]中。
1.由于这些下标一定不为0,所有循环结束后a[]中从0到(n-1)储存的整数不为0,可以得到数组长度为n。这就解决了上述问题1。
3.又由于a[]中只记录某字符重复出现的下标,当数组长度不为0时,才对其进行输出。这就解决了问题3。
2.为了解决问题2,我钻了一次空子。因为如果从“把已经查找过的字符删除”这个角度出发做题的话,会非常麻烦(毕竟是数组不是链表)。题目说字符串由字母和数字组成,因此我将已经查找过的字符用*取代,再在for循环的遍历过程中跳过该符号。

发布了6 篇原创文章 · 获赞 0 · 访问量 78

猜你喜欢

转载自blog.csdn.net/weixin_40246778/article/details/104253716
今日推荐