机试之字符串详解

现在找工作,除了简历这一关外,下一步大概率就是机试了,而字符串在机试中是比较常见的,毕竟字符串能看出代码习惯,逻辑能力等,而且字符串一不小心,就会有越界等问题,因此在机试遇到字符串就要小心任何细节了,我罗列了一些要注意的点(C中要注意的点)

  • 当采用数组来开辟字符串空间的时候,要进行数组的填充,填充‘\0’
  • 当采用数组来开辟字符串空间的时候,一定要开辟足够多的空间,比如题中说字符串最测100个字符,那开辟的空间一定要大于100,毕竟字符串还有一个结束符
  • 使用字符串的时候,一定要注意你操作的字符串长度和开辟的字符串长度,要是操作长度>开辟的空间,就会出问题,这也是为什么有些字符串的API接口里面会有操作长度的概念,比如函数strncpy里面就指定了操作的长度
  • 要注意操作字符串的指针指向的位置,有时候会采用指针++的方式来实现代码的编写,这种情况下指针指向会发生变化,要时刻注意你操作的指针指向哪里了
  • 操作的时候,一定要谨记字符串结束符,有些题中是需要你对字符串重排或者截取的,完成题中要求后,要注意在最后添加'\0'

目前就想到这五点,下面来看一下我之前机考遇到一道字符串的题:字符串统计(这道题之前和我对接的hr也提到过)

该题是给定一个字符串str,返回str的统计字符串。例如“aaabbbbcccd”的统计字符串为“a_3_b_4_c_3_d_1”,其中输入的字符串的长度满足1≤length(str)≤10^5 ,输出的也是字符串。

在例如输入字符串offerofferzainaliiiiii,输出为o_1_f_2_e_1_r_1_o_1_f_2_e_1_r_1_z_1_a_1_i_1_n_1_a_1_l_1_i_6

这道题有三个点要考虑,输入字符串,输出字符串,以及数据统计。下面分别说一下这三个方面

1.输入字符串

我采用数组来表示字符串,char str[100001] = {'\0'},注意此处我设置的大小是100001,且均填充了'\0'

让后通过函数scanf获取字符串即可scanf("%s", str);

2.数据统计

这个看题意,会认为是在整个字符串口进行统计,但看例子就能发现,算是统计一个字符串连续出现的次数,题意一定要看明白,且要结合例子,之前我就遇到过没细看题,导致怎么都不通过的情况,根据题意,实际上处理起来就简单了,只需要挨着判断每一个字符,且判断其同前一个字符是否相同就可以了,只是要注意字符串的边界,下面我用i表示数组的下标,j表示统计到的字符个数(初始值时1),考虑边界的情况,因此for循环从i = 1开始,当str[i] == str[i-1]时,字符的计数就需要+1,否则我就要拼凑输出的字符串了,如下面els中的处理,且能进入到else里面说明字符已经不一样了,按题中的描述,当字符不一样时,这一部分的统计也就结束,因此下面就进行了printf,然后接着进行下一个字符的判断

    for(i = 1;i <= strlen(str); i++)
    {
        if(str[i] == str[i-1])
        {
            j++;
        }
        else
        {
            if(i == strlen(str))
            {
                printf("%c_%d", str[i-1], j);
            }
            else{
                printf("%c_%d_", str[i-1], j);
            }
            j=1;
        }
    }

3输出字符串

这个题的好处是没要求输出一个指向输出字符串的指针,否则就不能采用上面第2点中的处理方式了。2中的处理其实没有进行输出字符串的拼接,要是题中要求输出的是字符串指针时,要我们就需要开辟足够的空间来存放我们的字符串信息,输入字符串最大是100000,那极端情况下输出字符串会更大,能达到100000 * 4(*4是因为一个输入字符,对应4个输出字符) - 1(这个1代表最后字符对应的是3个输出字符) + 1 (这个1代表'\0')

这道题就介绍到这,虽然这道题比较简单,但大家应该能看到,上面那5点均是需要注意的,而且网上有的人的代码在输入字符串的部分开辟的空间是char str[100000] = {'\0'},这也是常见的失误的地方,要是机试的测试用例不包含最长的字符串情况,那不会出问题,但我们最好还是给字符串结束符留一个空间最好了

#牛客创作充电计划#
全部评论
谢谢大佬
点赞 回复 分享
发布于 2022-12-07 22:21 重庆
马住惹!
点赞 回复 分享
发布于 2022-12-07 22:10 浙江

相关推荐

活泼的代码渣渣在泡池...:哈哈哈挺好的,我也上岸美团了,不说了,我又接了一单
点赞 评论 收藏
分享
评论
10
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务