这题样例一开始有个案例个数可是题目输入中却未说明,结果按输入格式为主,样例是错的,害我白白WA了一次。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <cmath>
#include <climits>
using namespace std;
const int MAXN = 100;
const int INF = INT_MAX;
int num[MAXN];
int main(){
// freopen("in.txt", "r", stdin);
int k;
//scanf("%d", &n);
while(~scanf("%d", &k)){
for(int i = 0; i < k; i++){
scanf("%d", &num[i]);
}
int count = 0, ans[MAXN];
if(num[0] != num[1]) ans[count++] = 0;
for(int i = 1; i < k-1; i++){
if(((num[i] > num[i-1]) && (num[i] > num[i+1])) || ((num[i] < num[i-1]) && (num[i] < num[i+1]))){
ans[count++] = i;
}
}
if(num[k-1] != num[k-2]) ans[count++] = k-1;
bool flag = false;
for(int i = 0; i < count; i++){
if(flag) printf(" ");
printf("%d", ans[i]);
flag = true;
}
printf("\n");
}
return 0;
}
这题我是利用了数组下标可以是字符的特性,把重复的字母存在一个ans数组中,再遍历原串求出出现的位置。
这题有个疑问就是字符长度最大是100,我数组开到了105居然不够,开到130才够,而visit和ans肯定不会溢出的情况下,能够溢出的只有num数组了,至于为什么溢出。。我搞不懂。。不过可以肯定的是,如果对自己的代码有信心的话,多半是溢出了,数组开大点就好。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <cmath>
#include <climits>
using namespace std;
const int MAXN = 130;
const int INF = INT_MAX;
int num[MAXN];
char ans[MAXN];
bool visit[MAXN];
int main(){
// freopen("in.txt", "r", stdin);
string str;
while(cin >> str){
memset(num, 0, sizeof(num));
memset(visit, false, sizeof(visit));
int length = str.size();
int count = 0;
for(int i = 0; i < length; i++){
num[str[i]]++;
}
for(int i = 0; i < length; i++){
if((num[str[i]] >= 2) && (visit[str[i]] == false)){
ans[count++] = str[i];
visit[str[i]] = true;
}
}
for(int i = 0; i < count; i++){
bool flag = false;
for(int j = 0; j < length; j++){
if(ans[i] == str[j]){
if(flag) printf(",");
printf("%c:%d", ans[i], j);
flag = true;
}
}
printf("\n");
}
}
return 0;
}