昨天碰巧看到一道微软校招的编程题,题目大意如下:

如果一个字符串包括三组或者更多组的连续升序字母,每组长度相等,那么我们就称这个字符串是Beautiful String如下是一些Beautiful String的例子:
abc、cde、aabbcc、aaabbbccc
这些不是Beautiful String:
abd、cba、aabbc、zab
输入一个只含有小写字母的字符串,如果它含有一个Beautiful的子串,就输出YES,否则输出NO输入:
第一行是案例个数,之后的每一行是一个数字,一个字符串,数字表示字符串长度,长度小于10MB输出:
YES或者NO

很容易想到可以用一个指针依次往前扫描,看是否符合Beautiful的条件,当出现不匹配时,从上次扫描起点的下一个位置开始新的尝试。这种判断过程可以用一个状态机来描述,我之前一直有一种模糊的想法,利用goto来实现不同状态的跳转,现在有这个题作为背景,正好可以试验一下这种想法,代码如下:

#include <stdio.h>
#include <stdlib.h>int main(void)
{int n, length;char * str;char *p;char * p_bak;int count[3];char pre;scanf("%d", &n);while (n--){scanf("%d", &length);str = (char*)malloc(sizeof(char) * (length + 1));scanf("%s", str);p = str;count[0] = 0;count[1] = 0;count[2] = 0;p_bak = p;goto SECTION_0;REWIND:count[0] = 0;count[1] = 0;count[2] = 0;p = ++p_bak;goto SECTION_0;SUCCESS:printf("YES\n");free(str);continue;FAIL:printf("NO\n");free(str);continue;SECTION_0:pre = *p;SECTION_A:if (*p == '\0')goto FAIL;if (*p == pre){++p;++count[0];goto SECTION_A;}else if (*p == pre + 1){goto SECTION_B;}else{goto REWIND;}SECTION_B:if (*p == '\0'){goto FAIL;goto FAIL; //向苹果致敬(●'◡'●),参见 http://coolshell.cn/articles/11112.html
        }if (*p == pre + 1){++p;++count[1];goto SECTION_B;}else if (*p == pre + 2){goto SECTION_C;}else{goto REWIND;}SECTION_C:if (count[0] != count[1])goto REWIND;if (*p == '\0')goto FINAL_CHECK;if (count[2] == count[1])goto SUCCESS;if (*p == pre + 2){++p;++count[2];goto SECTION_C;}FINAL_CHECK:if (count[2] != count[1])goto REWIND;elsegoto SUCCESS;}return 0;
}

从没写过这种就像汇编一样的面条代码,写完之后感觉整个人都要坏掉了,当然,一次AC。

(用C实现状态机应该可以利用switch case等功能来实现状态跳转,而不用goto,以后有时间再重构吧。)

转载于:https://www.cnblogs.com/intervention/p/4036996.html

微软校招编程题Beautiful String的状态机解法相关推荐

  1. 【vivo2021届秋季校招编程题】【java】广度优先搜索(BFS)/深度优先搜索(DFS)找最短路径长度

    vivo2021届秋季校招编程题 图中 找两点间的最短路径长度 广度搜索bfs/深度搜索dfs vivo游戏中心的运营小伙伴最近接到一款新游戏的上架申请,为了保障用户体验,运营同学将按运营流程和规范对 ...

  2. 搜狗校招编程题-建房子

    @[TOC][搜狗校招编程题-建房子] 题目描述 某市政府规划建设一个新的小镇,要求小镇上的所有房屋都坐落在同一条东西向大姐的北侧并且临街(两座房子不能重叠).到目前为止,这条街上已经建造了n座房子, ...

  3. 京东校招java面试题_京东2018校招编程题解答(Java)

    写在前面 本文主要是解答这次校招中京东的笔试编程题,这次京东的笔试编程题比较难,涉及KMP算法.manacher算法等.文中的解法也是在观看了左神(左程云)9月20号在牛客网的直播后,自己花时间写出来 ...

  4. 京东校招编程题——小熊分苹果

    刚做完京东校招在线笔试,第一道编程题居然没做出来,开始时没想到关键点还以为题目出错了,浪费了很多时间,郁闷-- 题目如下: N(1<N<9)只熊分一堆苹果,第一只熊(叫小东)把苹果平均分成 ...

  5. 网易2018年春招 校招编程题

    时间:2018.3.27 申请岗位:测试实习生(网易杭州)-音乐事业部 记录一下自己人生的第一次笔试吧..自己的水平还是太差了,希望以后自己翻到这篇文章的时候能够有进步. 20道选择题:其中一半都是测 ...

  6. 拼多多2018校招编程题

    [编程题] 最大乘积 给定一个无序数组,包含正数.负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)  输入描述: 无序整数数组A[n] 输出描述: 满足 ...

  7. 从网易校招编程题谈起,轻松理解有趣的0-1背包问题

    从网易的一道算法题开始 最近在准备春招实习,偶然做到网易的一道编程题,一方面找了很多博客看的云里雾里,这里特别写下解题的思路和逻辑,一方面加深印象,另一方面供需要的你学习参考.好了,话不多说,开始吧. ...

  8. 字节跳动2018算法工程师校招编程题题解(第二批)

    编程题1 题目大意 为了不断优化推荐效果,今日头条每天要存储和处理海量数据.假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内 ...

  9. 小米校招编程题:数组乘积、异形数、朋友圈

    这里记录一下方便查找,原文地址:http://blog.csdn.net/hackbuteer1/article/details/8484974 二.编程题 1.数组乘积(15分) 输入:一个长度为n ...

最新文章

  1. 尤雨溪携手字节前端专家,畅聊 Vue 3.0 前端技术新趋势
  2. 搭建elasticsearch+kibana+logstash+filebeat
  3. jquery链式写法 java_jQuery链式操作
  4. 如何查看linux下串口信息
  5. 使用 Directory.Build 来消除项目文件中的重复配置
  6. 最实用的APP界面设计知识,有温度的APP设计(转)
  7. Django:DjangoProject项目结构简介
  8. 随想录(我们的竞争力)
  9. android 软件 加密方法,Android中WIFI常见的几种加密方式(详细)
  10. 贺利坚老师汇编课程49笔记:call和ret
  11. Flink API之Source入门
  12. shiro框架学习(一)
  13. fireworks CS6安装教程
  14. 《东周列国志》第八十六回 吴起杀妻求将 驺忌鼓琴取相
  15. 使用WIFI通讯,手机秒变单片机大屏显示器
  16. weblogic新建一个managed server并启动
  17. 人脸识别接口_人脸识别云服务
  18. 云计算在美国的五年是如何发展的?
  19. js 生成条形码例子
  20. 2010nbsp;网络流行语考试题nbsp;(含答案)

热门文章

  1. Android挂断电话流程
  2. 在ModelSim中添加Xilinx仿真库
  3. 分销商城小程序系统怎么选择?
  4. CocosCreator特效系列之素描效果
  5. SAR成像处理算法_RD算法_基本原理
  6. win11点击任务栏音量、无线、电池按钮无反应的解决过程
  7. 教大家如何下載土豆,56,youku等在綫視頻網站視頻
  8. 集成一个以官网(微信,QQ,微博)为标准的登录分享功能
  9. 综合实践活动信息技术小学版第三册电子课本_人教版小学美术16年级电子课本图片+教材分析...
  10. 兄弟连教育python培训