您的位置:首页 > 编程语言 > C语言/C++

[笔记]一道C语言面试题:判断字串是否可以通过重新排列字母使之对称

2011-09-06 23:10 435 查看
题目:输入一个字符串,如“adcaeceeed”,判断是否可以通过重新排列使之可以输出对称字符串,如本例可以输出“adceeeecda”,返回True。

来源:某500强企业面试题目

思路:扫描字串,对每个字符出现的次数累加,如果次数为奇数的字符个数不超过1个,则返回True,否则返回False

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

//----------------------------------------
// 判断字串是否可以重新排列字母,使之对称
// 如输入"abab",可以得到"abba",则输出 True
// 如输入"abc",则输出 False
//----------------------------------------
bool CheckIfCanBeSymmetric(char *str) {
// 扫描字串,对每个字符出现的次数累加,如果次数为奇数的字符个数不超过1个,则返回True,否则返回False
int i = 0;
int n = 0;
int CountList[256] = {0};     // 对ASCII码每个字符对应一个计数器

if (str == NULL) return false;
if (strlen(str) <= 1) return true;

// 扫描字串,对每个字符对应的计数器++
for (i = 0; i < strlen(str); i++)
CountList[str[i]]++;

// 检查计数器列表,如果有超过1个奇数,则返回 False
for (i = 0, n = 0; i < 255; i++) {
if (CountList[i] % 2 == 1) n++;

if (n > 1) return false;
}

return true;
}

//-------------------------------------------------------------------------

void TestCheckIfCanBeSymmetric(void) {
int n;
char s1[] = "ab--++++ca@@bc!!!!~~";
char s2[] = "abcbc";
char s3[] = "abbc";
char s4[] = "";

printf("%s is %d\n", s1, CheckIfCanBeSymmetric(s1));
printf("%s is %d\n", s2, CheckIfCanBeSymmetric(s2));
printf("%s is %d\n", s3, CheckIfCanBeSymmetric(s3));
printf("%s is %d\n", s4, CheckIfCanBeSymmetric(s4));
}

//-------------------------------------------------------------------------

int main(int argc, char *argv[]) {
TestCheckIfCanBeSymmetric();

getchar();
return 0;
}

Technorati 标签: C语言,面试题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐