第一篇链接:字符串类习题、面试题详解(第一篇)

6题:回文串(竞赛基础题)

输入一个字符串,求出其最长回文子串。子串的含义是:在原串中连续出现的字符串片段。回文的含义是:正着看和倒着看相同,如abba和yyxyy。在判断时,应该忽略所有标点符号和空格,且忽略大小写,但输出应保持原样(在回文串的首部和尾部不要输出多余字符)。输入字符串长度不超过5000,且占据单独一行。应该输出最长的回文串,如果有多个,输出起始位置最靠左的。

样例输入:Confuciuss say: Madam, I’m Adam.

样例输出:Madam,I’m Adam

方法1:枚举回文串的起点和终点。

 1 #include <stdio.h>
 2 #include <ctype.h>
 3 #include <string.h>
 4 #define MAXN 5000 + 10
 5
 6 char buf[MAXN], s[MAXN];
 7 int p[MAXN];
 8
 9 int main(void)
10 {
11     int n, m = 0, max = 0, x = 0, y = 0;
12     int i, j, k, ok;
13     fgets(buf, sizeof(buf), stdin);
14     n = strlen(buf);
15
16     for (i = 0; i < n; i++)
17     {
18         if (isalpha(buf[i]))
19         {
20             p[m] = i;                        //保存字符的实际位置
21             s[m++] = toupper(buf[i]);        //保存为大写字母
22         }
23     }
24
25     for (i = 0; i < m; i++)                //枚举回文串起始位置
26     {
27         for (j = i; j < m; j++)            //枚举回文串终止位置
28         {
29             ok = 1;
30             for (k = i; k <= j; k++)
31             {
32                 if (s[k] != s[i + j - k])
33                     ok = 0;
34             }
35
36             if (ok && j - i + 1 > max)
37             {
38                 max = j - i + 1;
39                 x = p[i];
40                 y = p[j];
41             }
42         }
43     }
44
45     for (i = x; i <= y; i++)
46     {
47         printf("%c", buf[i]);
48     }
49     printf("\n");
50
51     return 0;
52 }

方法2:枚举回文串的中间位置。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <ctype.h>
 4 #define MAXN 5000 + 10
 5 char buf[MAXN], s[MAXN];
 6 int p[MAXN];
 7
 8 int main(void)
 9 {
10     int n, m = 0, max = 0, x = 0, y = 0;
11     int i, j;
12     fgets(buf, sizeof(buf), stdin);
13     n = strlen(buf);
14
15     for (i = 0; i < n; i++)
16     {
17         if (isalpha(buf[i]))
18         {
19             p[m] = i;                   //保存字符实际位置
20             s[m++] = toupper(buf[i]);
21         }
22     }
23
24     for (i = 0; i < m; i++)             //枚举回文串的中间位置
25     {
26         for (j = 0; i - j >= 0 && i + j < m; j++)       //回文子串长度为奇数
27         {
28             if (s[i - j] != s[i + j])
29                 break;
30             if (j * 2 + 1 > max)
31             {
32                 max = j * 2 + 1;
33                 x = p[i - j];
34                 y = p[i + j];
35             }
36         }
37
38         for (j = 0; i - j >= 0 && i + j + 1 < m; j++)   //回文串长度为偶数
39         {
40             if (s[i - j] != s[i + j + 1])
41                 break;
42             if (j * 2 + 2 > max)
43             {
44                 max = j * 2 + 2;
45                 x = p[i - j];
46                 y = p[i + j + 1];
47             }
48         }
49     }
50
51     for (i = x; i <= y; i++)
52         printf("%c", buf[i]);
53     printf("\n");
54
55     return 0;
56 }

解析:枚举回文串的中间位置时要注意长度为奇数和偶数的处理方式是不一样的。

7题:编码实现求给定字符串(全为小写英文字母)的最小后继,如"abc"的最小后继为"abd","dhz"的最小后继为"di"。(Google笔试题)

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MAXN 1024
 4
 5 int main(void)
 6 {
 7     char buf[MAXN];
 8     int n, m, i;
 9     scanf("%s", buf);
10
11     n = strlen(buf);
12     for (i = n - 1; i >= 0; i--)
13     {
14         if (buf[i] + 1 <= 'z')
15         {
16             buf[i] += 1;
17             buf[i + 1] = '\0';
18             break;
19         }
20     }
21     printf("%s\n", buf);
22
23     return 0;
24 }  

解析:对最后一个字符+1,如果大于'z'则对前一个字符+1,如果又大于 'z' 则重复之前的步骤。

8题:X86结构下,下面代码的printf输出结果是什么?(西艾面试题)

 1 #include <stdio.h>
 2
 3 int main(void)
 4 {
 5     char str[20]="Good night";
 6     int *p = (int *)str;
 7     p[0] = 0x61626364;
 8     p[1] = 0x31323334;
 9     p[2] = 0x41424344;
10     printf("%s\n", str);
11
12     return 0;
13 }  

解析:输出结果为:dcba4321DCBA。X86结构下,数据的低位保存在内存的低地址中,数据的高位保存在内存的高地址中。还需要注意常见字符的ASCII码(十进制),’a’为97,’A’为65,’1’为49。

9题:编一个函数,输入一个字符串,要求做一个新字符串,把其中所有的一个或多个连续的空白字符都压缩为一个空格。这里所说的空白包括空格、'\t'、'\n'、'\r'。例如原来的字符串是:

This Content hoho       is ok

ok?

file system

uttered words   ok ok     ?

end.

压缩了空白之后就是:

This Content hoho is ok ok? file systemuttered words ok ok ? end.(面试题)

参考程序如下:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4
 5 const char *p = "This Content hoho       is ok\
 6         ok?\
 7 \
 8         file system\n\
 9 uttered words   ok ok      ?\
10 end.";
11
12 int IsSpace(char c)
13 {
14     if (c == ' ')
15         return 1;
16     else if (c == '\n' || c == '\r')
17         return 2;
18     else if (c == '\t')
19         return 3;
20     else
21         return 0;
22 }
23
24 char *shrink_space(char *dest, const char *src, size_t n)
25 {
26     char *t_dest = dest;
27     char temp;
28     int pre = -1, cur = -1, key = -1;
29     while (IsSpace(*src))   //忽略字符串起始空格
30          src++;
31     *t_dest = *src;
32
33     while ((temp = *src++) != '\0')
34     {
35         key = IsSpace(temp);
36         if (0 == key)               //0表示字符
37         {
38             cur = 0;
39             *t_dest++ = temp;
40         }
41         else if (1 == key)          //1表示空格
42         {
43             if (pre == 1)           //如果前面也是空格
44                 continue;
45             else
46             {
47                 cur = 1;
48                 *t_dest++ = temp;
49             }
50         }
51         else if (2 == key && pre == 0)
52         {
53             *t_dest++ = ' ';
54         }
55         else if (3 == key)
56         {
57             if (pre == 1)
58                 continue;
59             else
60             {
61                 *t_dest++ = ' ';        //将\t转换为1个空格
62                 cur = 1;
63             }
64         }
65        pre = cur;
66     }
67     *t_dest = '\0';
68
69     return dest;
70 }
71 int main(void)
72 {
73     int len = strlen(p);
74     char *dest = (char *)malloc(sizeof(char) * (len + 1));
75     shrink_space(dest, p, 1);
76     printf("%s\n", dest);
77     free(dest);
78     dest = NULL;
79
80     return 0;
81 }  

10题:写出在母串中查找子串出现次数的代码。(面试题)

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define BUFSIZE 1024
 4
 5 int StrCount(char *strLong, char *strShort)
 6 {
 7     int result = 0;
 8     char *t_strS = strShort;
 9     char *t_strD = strLong;
10     while (*t_strD != '\0')
11     {
12         t_strS = strShort;    //子串
13         while (*t_strD == *t_strS && *t_strS != '\0' && *t_strD != '\0')
14         {
15             t_strD++;
16             t_strS++;
17         }
18         if (*t_strS == '\0')
19             result += 1;
20         else if (*t_strD == '\0')
21             break;
22         else
23             t_strD++;
24     }
25
26     return result;
27 }
28
29 int main(void)
30 {
31     int len;
32     char strD[BUFSIZE], strS[BUFSIZE];
33     fgets(strD, sizeof(strD), stdin);
34     len = strlen(strD);
35     strD[len - 1] = '\0';
36     fgets(strS, sizeof(strS), stdin);
37     len = strlen(strS);
38     strS[len - 1] = '\0';
39     printf("%d\n", StrCount(strD, strS));
40     return 0;
41 }  

转载于:https://www.cnblogs.com/mengwang024/p/4138203.html

字符串类习题、面试题详解(第二篇)相关推荐

  1. IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm(转载)

    IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm 自从本系列发布之后,收到了很多的朋友的回复!非常感谢,同时很多朋友问到了一些问题,有些问 ...

  2. IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm

    自从本系列发布之后,收到了很多的朋友的回复!非常感谢,同时很多朋友问到了一些问题,有些问题是一些比较基本的问题,由于时间的缘故,不会一一的为大家回复,如果有不明白的,希望大家勤自学!本系列虽然不难,但 ...

  3. python 数据类笔试题_一道 Python 类的笔试题详解

    r = {} class C(object): def __init__(self, a, b): self.a = a self.b = b if b == 'a': orig = super(C, ...

  4. 关于java中的中的控制语句 详解第二篇——选择语句——switch语句

    本文中将详细介绍 java中的控制语句 包括 语法规则.代码图片.执行原理.构建思路等. 若有细瑕,感谢指正! java中的控制语句 控制语句即用来实现对程序流程的选择.循环.转向和返回等进行控制. ...

  5. IIS负载均衡-Application Request Route详解第一篇: ARR介绍

    IIS负载均衡-Application Request Route详解第一篇: ARR介绍   说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Appli ...

  6. 蘑菇街2015校招 Java研发笔试题 详解,2015java

    蘑菇街2015校招 Java研发笔试题 详解,2015java 1. 对进程和线程描述正确的是( ) A.  父进程里的所有线程共享相同的地址空间,父进程的所有子进程共享相同的地址空间. B.  改变 ...

  7. Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3

    Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3 总览 问题 详解 String.intern()的作用 link LeetCode的Two Sum题 ...

  8. 最全最详细前端vue面试题+详解答案(拿到高薪offer不是梦)

    最全vue面试题+详解答案 1.MVC 和 MVVM 区别 MVC MVC全名是 Model View Controller,时模型 - 视图 - 控制器的缩写,一种软件设计典范. Model(模型) ...

  9. Java开发常见面试题详解(JVM)_2

    Java开发常见面试题详解(JVM)_2 JVM 问题 详解 JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots link 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认 ...

最新文章

  1. 面试高频题:单链表的逆置操作/链表逆序
  2. 微信WebView关闭后本地cookie无法清除问题
  3. 解决Pycharm窗口一闪而过的问题
  4. 标准I/O小程序-文件拷贝
  5. 【移植驱动到Linux3.4.2内核之二】LCD,触摸屏,按键,USB等驱动程序的移植心得总结
  6. python定义集合_Python - 集合
  7. C程序设计语言现代方法18:声明
  8. 收藏 | NLP论文、代码、博客、视频资源(LSTM,指针模型,Attention, ELMo,GPT,BERT、多任务学习等)...
  9. 西安互联网公司和生活成本
  10. 汉庭加盟:连锁酒店影视房的市场分析
  11. java中mysql的优化,Java培训实战教程之mysql优化
  12. 2022年山东省安全员C证考试资料及山东省安全员C证考试试题
  13. 机房收费系统之思想性总结
  14. NTL密码算法开源库-大整数ZZ类(三)
  15. Java学习简单画椭圆
  16. 比较快得Maven镜像
  17. 陕西宝鸡发现桃花水母 (组图)
  18. C语言基础知识点(领卓教育)
  19. 计算机 打印格式 不一样,同一个EXCEL表格在不同电脑打印出来的不一样,如何解决?:excel表格自动变形...
  20. TIOBE 2月编程语言排行榜出炉:Python遥遥领先C语言

热门文章

  1. Java导出源程序_JAVA导出项目的所有源代码到一个文件
  2. C语言丨线性表(二):线性链表(单链表)
  3. python中if和elif的区别_浅谈对python中if、elif、else的误解
  4. mongodb 集群shard_mongodb集群构建方案(二)
  5. win10 mysql 远程访问_win10 docker部署mysql并启动远程连接
  6. html 列表点,HTML + CSS:不带句点的有序列表?
  7. c语言,在主函数中输入一个整数,求该整数各位数字的乘积,[求助]求由键盘输入的任意两个整数的积...
  8. SpringSecurity SecurityContextHolderSecurityContext
  9. ubuntu PPA
  10. C语言size_t类型