這題樣例一開始有個案例個數可是題目輸入中卻未說明,結果按輸入格式爲主,樣例是錯的,害我白白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;
}