机试之字符串详解
现在找工作,除了简历这一关外,下一步大概率就是机试了,而字符串在机试中是比较常见的,毕竟字符串能看出代码习惯,逻辑能力等,而且字符串一不小心,就会有越界等问题,因此在机试遇到字符串就要小心任何细节了,我罗列了一些要注意的点(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'},这也是常见的失误的地方,要是机试的测试用例不包含最长的字符串情况,那不会出问题,但我们最好还是给字符串结束符留一个空间最好了
#牛客创作充电计划#