题解 | #找位置#
找位置
https://www.nowcoder.com/practice/e3b2cc44aa9b4851bdca89dd79c53150
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
typedef struct KeyValue {
char key;//字符
int position[100];//出现的位置
int cnt;//出现的次数
} KeyValue ;
KeyValue* stas[26 + 26 + 10]; //统计结构体数组
int n = 0; //记录出现字符的种类
_Bool isNotExist(int position, char c) {
//后续字符先判断是否已经存在,若存在则修改,若不存在则加入
int i = 0;
for ( i = 0; i < n; i++) {
if (stas[i]->key == c) {
stas[i]->position[stas[i]->cnt] = position;
stas[i]->cnt += 1;
return false;
}
}
return true;
}
void insert(int positin, char c) {
KeyValue* newKV;
if (isNotExist(positin,
c)) { //如果是第一个字符或者不存在的字符,则直接加入
newKV = malloc(sizeof(KeyValue));
newKV->cnt = 0;
newKV->key = c;
newKV->position[newKV->cnt] = positin;
newKV->cnt += 1;
stas[n] = newKV;
n++;
}
}
int main() {
int a, b;
char str[100];
while (gets(str)) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld") to
int i = 0;
n = 0;
for (i = 0; i < strlen(str); i++) {
insert(i, str[i]);
}
int j = 0;
for (i = 0; i < n; i++) {
if (stas[i]->cnt > 1) {
for (j = 0; j < stas[i]->cnt; j++) {
printf("%c:%d", stas[i]->key, stas[i]->position[j]);
if(j!=stas[i]->cnt-1){
printf(",");
}
}
printf("\n");
}
}
}
return 0;
}

