华为杯程序大赛初赛试题解析

    不多说,先亮题目:

第一题:请找出给定字符串中的大写字母,并存在给定的输出数组里;
第二题:请找出给定字符串中的数字,并按由大到小排序后重新输出,其他字符位置不变;
第三题:通配符应用,请从给定字符串中找出规定的子串,找全,*表示多个字符匹配,?表一个字符匹配。

   题目考的比较基础,所以基本功一定要扎实。只要对字符这一块比较了解,解决第一题和第二题应该问题不大,第三题相对复杂点。

   第一题:字符串一般由大写字母、小写字母、数字、特殊字符组成,每一个字符都对应一个ASCII码。根据ASCII码表,小写字母的ASCII段为97-122;大写字母的ASCII段为65-90;0到9的数字为48-57。有了这些基础知识,第一个题目就迎刃而解了。笔者初步尝试了下,代码如下:

char *find_capital_chars(const char *ch)
{
    int len = strlen(ch);
    char *capital_chars = (char *)malloc(sizeof(char) * len);//先按最大内存分配
     memset(capital_chars, 0, len);
    int count = 0;
    for (int i = 0; i < len; i++)
    {
        if (ch[i]>=65 && ch[i] <=90)
        {
            capital_chars[count] = ch[i];
            count++;
        }
     }
    capital_chars = (char *)realloc((char *)capital_chars, count);//去掉多余分配的内存, 牺牲时间节省空间 
    return    capital_chars;
}


 

   第二题:有了第一题的基础,第二题就好解决了,只是增加了一个排序算法。为了简便,笔者只是采用了最简单的冒泡排序法实现。代码如下:

 

//建立映射表
typedef struct 
{
    char value;    //数值
     int index;    //位于字符串中的位置
} NUM_MAP;
char *find_numbers(char ch[])
{
int len = strlen(ch);
NUM_MAP *map = (NUM_MAP *)malloc(sizeof(NUM_MAP) * len); 
int count = 0;
//将数字放到map中
for (int i = 0; i < len; i++)
{
if (ch[i] >= 48 && ch[i] <= 57)
{
map[count].value = ch[i];
map[count].index = i;
count++;
}
}
//map中的数值排序,简单的冒泡排序,速度慢
int temp = 0;
for (int i = 0; i < count; i++)   
{
   for (int j = i+1;j < count; j++)   
   {
        if (map[i].value < map[j].value)    /*如果前面一个数比后面数小,交换两个数的值。*/
        {
            temp=map[i].value;
            map[i].value=map[j].value;
            map[j].value=temp;
        }
   }
}
//将排序好的重新写入到字符串
for (int j =0; j < count; j++)
{
char tmp_value = map[j].value;
int tmp_index = map[j].index;
ch[tmp_index] = tmp_value;
}

free(map);//释放内存

return ch;
}


 

第三题:由于时间原因,还没分析透,有兴趣的话可以见后续部分。


测试程序如下:

#include <stdlib.h>
#include <stdio.h>
#include <string>
int main()
{
char *test_chars1 = "aAFakjaAakOIRakTOIJFALakdfjakfjEERT";
char* out_chars1 = find_capital_chars(test_chars1);
printf("%s\n", out_chars1);
char test_chars2[] = "asd1fa34sdf8a2ds6fs2adfs1d5afs9da";
char* out_chars2 = find_numbers(test_chars2);
printf("%s\n", out_chars2);
getchar();
return 0;
}


 


 

你可能感兴趣的:(算法,struct,测试,华为,Numbers)