40.百度研发笔试题

2)一串首尾相连的珠子(m 个),有 N 种颜色(N<=10),
设计一个算法,取出其中一段,要求包含所有 N 中颜色,并使长度最短。
并分析时间复杂度与空间复杂度。

思路:

先将表示珠子的串in复制两遍,变成inin这样就不用余数了。

我用char型表示不同的颜色。s表示当前起始点,e表示当前结束点。

用hash[256]来存放s到e不同颜色的珠子出现次数,避免char转数字的麻烦。

先把s、e都定位在开始,e向后遍历,直到遇到N种不同颜色。

之后遍历时,s定位到下一个颜色的位置,如果总颜色数变少,e再定位到总颜色数为N的位置。

直到s的位置超过链子长度m.

理论上会遍历两遍时间复制度为O(m),空间上如果直接用整数表示不同的珠子需要O(N)

/*
40.2)
一串首尾相连的珠子(m 个),有 N 种颜色(N<=10),
设计一个算法,取出其中一段,要求包含所有 N 中颜色,并使长度最短。
并分析时间复杂度与空间复杂度。
*/ #include <stdio.h>
#include <stdlib.h>
#include <string.h> int shortestlengh(char * in, char ** dst, int N)
{
//变成inin的形式,避免求余
int nlen = strlen(in);
char * in2 = (char *)malloc( * nlen * sizeof(char));
memcpy(in2, in, nlen * sizeof(char));
memcpy(in2 + nlen, in, nlen * sizeof(char)); int start = , end = nlen - ;
int shortestlen = nlen;
int hash[] = {};
int colornum = ;
int s = , e = -;
//遍历所有可能的起始点
while(s < nlen)
{
while(colornum < N && e <= * nlen) //找到在当前起点下找到所有颜色的结尾
{
e++;
if(hash[int(in2[e])] == )
{
colornum++;
}
hash[int(in2[e])]++;
}
//去掉前面相同的部分
while(in2[s] == in2[s + ])
{
s++;
hash[(int)in2[s]]--;
} //更新最短的串
if(shortestlen > e - s + )
{
shortestlen = e - s + ;
start = s;
end = e;
} //更新s,从下一个颜色开始
hash[(int)in2[s]]--;
if(hash[(int)in2[s]] == )
{
colornum--;
}
s = s + ;
} *(dst) = (char *)malloc(end - start + );
memcpy(*dst, in2 + start, end - start + );
(*dst)[end - start + ] = '\0'; //注意 free(in2); return end - start + ;
} int main()
{
char * s = "addcddcbccbba";
char * d = NULL;
int n = shortestlengh(s, &d, );
printf("%d\n%s\n", n, d);
return ;
}

【编程题目】一串首尾相连的珠子(m 个),有 N 种颜色(N<=10),取出其中一段,要求包含所有 N 中颜色,并使长度最短。的更多相关文章

  1. OJ——华为编程题目:输入字符串括号是否匹配

    package t0815; /* * 华为编程题目:输入字符串括号是否匹配 * 若都匹配输出为0,否则为1 * 样例输入:Terminal user [name | number (1)] * 样例 ...

  2. php实现 提取不重复的整数(编程题目能够最快的熟悉函数)

    php实现 提取不重复的整数(编程题目能够最快的熟悉函数) 一.总结 一句话总结:编程题目能够最快的熟悉函数. 1.字符串反转函数? 没有str_revserse,有arr_reverse,这里是st ...

  3. 网易云课堂_C++程序设计入门(下)_期末考试_期末考试在线编程题目

    期末考试在线编程题目 返回考试   本次考试题目一共两个,在考试期间可以不限制次数地提交 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间 ...

  4. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  5. WPF编程,通过Double Animation动态旋转控件的一种方法。

    原文:WPF编程,通过Double Animation动态旋转控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/art ...

  6. WPF编程,通过Double Animation动态缩放控件的一种方法。

    原文:WPF编程,通过Double Animation动态缩放控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/art ...

  7. shell编程系列16--文本处理三剑客之awk模式匹配的两种方法

    shell编程系列16--文本处理三剑客之awk模式匹配的两种方法 awk的工作模式 第一种模式匹配:RegExp 第二种模式匹配:关系运算匹配 用法格式对照表 语法格式 含义 RegExp 按正则表 ...

  8. 小议 - 来自《XX时代XX公司》的笔试编程题目

    经过几天的雾霾,魔都终于放晴了.哥投了几天的简历,希望找到一份.NET开发方面的岗位.也收到了几个面试邀请.这不应Ge老师的要求,选了个良辰吉日,带着身份证,学位证怀揣着2B青年的梦想来这个XX公司面 ...

  9. 关于C语言的几个考试编程题目

    提交要求:1:邮件名称:学号后三位-题目编号-姓名-期中考试.例如:098-1-沈苗-期中考试2:不用附件提交,直接写邮件,内容包括编程思路(写一段自己对题目的认识.思路.技术细节等).源代码.运行结 ...

随机推荐

  1. 基础知识系列☞IList ←vs→ List

    原文地址→http://www.cnblogs.com/zbphot/archive/2011/11/04/2235933.html IList接口→表示可按照索引单独访问的对象的非泛型集合. ILi ...

  2. POJ 2115 C Looooops

    扩展GCD...一定要(1L<<k),不然k=31是会出错的 ....                        C Looooops Time Limit: 1000MS   Mem ...

  3. mysql 删除重复数据,并保存最新一条数据

    删除重复行 DELETE FROM ecm_member_login_session WHERE (number , client_code) IN ( ) AND update_time NOT I ...

  4. jQuery对话框插件 ThickBox

    http://baike.haosou.com/doc/7607201-7881296.html 项目已经停止维护,但该插件还是不错的! ThickBox是一个基于JQuery类库的扩展,它能在浏览器 ...

  5. 使用group_concat 时,设置mysql默认的长度

    SHOW VARIABLES LIKE "group_concat_max_len";   SET GLOBAL group_concat_max_len=1024000; SET ...

  6. 对象的constructor属性

    对象的constructor属性, 最初是用来标识对象类型的. 比如 ,我们定义一个 Person类,然后实例化两个对象. function Person(name, age, job){this.n ...

  7. Java反射-方法(Method)

    工作了三年,第二次使用反射! 遇到的问题描述: 多个页面查询后,返回的List中的对象属性为“.00”,页面显示不友好. 查询原因是因为查询数据的SQL为:to_char(a.applyAmount, ...

  8. Eclipse/MyEclipse 安装国际化资源文件编辑插件(i18n tools)

    一.JInto 官网:http://www.guh-software.de/index_en.html http://www.guh-software.de/jinto_en.html 下载地址:ht ...

  9. Linux之Shell脚本计算命令行的所有和

    问题:设计一个Shell脚本:求命令行上所有整数和 Shell代码: 调用add.sh脚本结果:

  10. 2016年11月2日--Window.document对象

    一.找到元素: docunment.getElementById("id"):                      根据id找,最多找一个: var a =docunment ...