[笔记]一道C语言面试题:判断字串是否可以通过重新排列字母使之对称
来源:互联网 发布:高达MA知乎 编辑:程序博客网 时间:2024/06/16 10:14
题目:输入一个字符串,如“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;}
转自:http://www.cnblogs.com/journeyonmyway/archive/2011/09/06/2169291.html