`
googya
  • 浏览: 144081 次
  • 性别: Icon_minigender_1
  • 来自: 汉川
社区版块
存档分类
最新评论

有道难题

阅读更多

    有道的工程师闲暇之余,将Base64编码改成了Base4编码,即把每个8Bit的字节转换成4个2Bit的字节,然后以4个字符来代替。编码和字符的对应方案如下:
    00 ---- a
    01 ---- o
    10 ---- d
    11 ---- 空格
    这样,编码后的字符串就只会含有字符‘d','a','o'和空格。

    例如字符y ,其ASCII码是121,对应的二进制串是01111001,这样分成 01 11 10 01四块后,用Base4编码后的字符串为"o do"。

    有道的工程师很好奇,按照这种编码方式,编码后的字符串中含有多少个完整的dao呢?一个完整的dao由连续的‘d','a','o'三个字符组成。
输入
    第一行有一个正整数n,代表接下来有n个待编码的原串。(1 <= n <= 10)
    接下来有n行,每行有一个长度不超过106的原串,原串中的字符可能为ASCII码中除换行符以外的任意可见字符。
输出
    共有n行,每行为一个整数k, 表示输入数据中对应的原串用Base4编码后含有多少个完整的dao。
样例输入

    2
    www.youdao.com
    dict.youdao.com

样例输出

    1
    1





以上是“有道难题” 的一个题目,限定用Java或者C系列的语言写,那些东西我都差不多忘光了,实在写不出来。稍微熟悉一点的就是Ruby了,写了个大概的(不完整),希望大家多提意见,也把自己的代码拿出来亮亮。

s="www.youdao.com/youdao"

t=s.unpack("B*")
g=[]
t=t.split(//)
t.each_with_index do |x,i|
	if i%2!=0
	 g<<[t[i-1],x]
	end
end

g.map!{|x|x.to_s}
p g
g.map! do |x|
	case x
	when "00"
	  "a"	  
	when "01"
	   "o"
	when "10"
	   "d"
	when "11"
	   " "	   
	end
end

	p g.to_s.scan(/dao/).size

 

 

分享到:
评论
18 楼 googya 2010-06-07  
jasongreen 写道
googya 写道
相比之下,googya的代码显得相当的笨拙!
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法


用自己的名字替换第一人称是相当伪娘的做法



你不说我还没什么感觉,现在越想越不对劲。
17 楼 Hooopo 2010-06-07  
jasongreen 写道
googya 写道
相比之下,googya的代码显得相当的笨拙!
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法


用自己的名字替换第一人称是相当伪娘的做法

原来如此,怪不得看到别人这么称呼自己的时候觉得怪怪的呢....
16 楼 jasongreen 2010-06-07  
googya 写道
相比之下,googya的代码显得相当的笨拙!
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法


用自己的名字替换第一人称是相当伪娘的做法
15 楼 googya 2010-06-03  
savon_cn 写道
我觉得算法的题目,最好能讲一下思路,代码不好懂的
我的思路就是
  1.先把字符串转成01。。。的串
  2.查找100001的串,看它出现的位置,如果 pos%2=0,那么就算1个,这样累加



是的,我的也是这样的思路,很直观的一种想法。
14 楼 savon_cn 2010-06-03  
我觉得算法的题目,最好能讲一下思路,代码不好懂的
我的思路就是
  1.先把字符串转成01。。。的串
  2.查找100001的串,看它出现的位置,如果 pos%2=0,那么就算1个,这样累加
13 楼 googya 2010-06-02  
楼上的结果没问题!
性能上应该也没有什么问题。比Ruby写的方式要快。
12 楼 litianzzk 2010-06-02  
试试C++的,n久不写了,没怎么测试过:
#include <iostream>
using namespace std;

const unsigned char daos_in_a_byte[2] = {
    0x84, //10000100
    0x21  //00100001
}; 
const unsigned char daos_in_a_byte_mask[2] = {
    0xFC, //11111100
    0x3F  //00111111
};
const unsigned short daos_in_a_word[2] = {
    0x4008, //00001000_01000000
    0x1002  //00000010_00010000
}; 
const unsigned short daos_in_a_word_mask[2] = {
    0xC00F, //00001111_11000000
    0xF003  //00000011_11110000
};

int count_in_byte(const unsigned char byte)
{
    return ((byte & daos_in_a_byte_mask[0]) == daos_in_a_byte[0]) ||
            ((byte & daos_in_a_byte_mask[1]) == daos_in_a_byte[1]);
}

int count_in_word(const unsigned short word)
{
    return ((word & daos_in_a_word_mask[0]) == daos_in_a_word[0]) ||
            ((word & daos_in_a_word_mask[1]) == daos_in_a_word[1]);
}

int count_dao(const unsigned char* str)
{
    int result = 0;
    for (int i = 0; *(str + i) != 0; ++i)
    {
        result += count_in_byte(*(str + i));
        if (*(str + i + 1) != 0)
        {
            result += count_in_word(*(const unsigned short * )(str + i));
        }
    }
    return result;
}

int main(int argc, char** argv) {
    char* str1 = "www.youdao.com";
    char* str2 = "dict.youdao.com";
    cout << count_dao((const unsigned char * )str1) << endl;
    cout << count_dao((const unsigned char * )str2) << endl;
    return 0;
}

11 楼 eric_kong 2010-06-01  
直接用KMP算法不就行了吗?
10 楼 shuiguozheng 2010-05-31  
sevk 写道
为了不超时,只能分段统计.
每段的连接处也要考滤10 00 01 .

  你的图像太有诱惑力了
9 楼 huanyun007 2010-05-31  
public static void main(String[] args) {
List<String> lines = new ArrayList<String>();
char[] codes = new char[] { 'a', 'o', 'd', ' ' };
lines.add("www.youdao.com");
lines.add("dict.youdao.com");
for (String line : lines) {
if (line.length() == 0) {
continue;
}
int size = 0;
char[] queue = new char[] { ' ', ' ', ' ' };
int index = 0;
char[] chars = line.toCharArray();
for (int i = 0; i < chars.length; i++) {
queue[index] = codes[(chars[i] >>> 6) & 0x3];
index = (index + 1) % queue.length;
size += check(queue, index) ? 1 : 0;

queue[index] = codes[(chars[i] >>> 4) & 0x3];
index = (index + 1) % queue.length;
size += check(queue, index) ? 1 : 0;

queue[index] = codes[(chars[i] >>> 2) & 0x3];
index = (index + 1) % queue.length;
size += check(queue, index) ? 1 : 0;

queue[index] = codes[chars[i] & 0x3];
index = (index + 1) % queue.length;
size += check(queue, index) ? 1 : 0;
}
System.out.println(size);
}
}

public static boolean check(char[] chars, int index) {
return chars[index] == 'd' && chars[(index + 1) % chars.length] == 'a'
&& chars[(index + 2) % chars.length] == 'o';
}

#写的有点复杂
按上面的思路不过还可以进行优化,比如可以按照KMP相关的思路减少check次数
8 楼 sevk 2010-05-31  
为了不超时,只能分段统计.
每段的连接处也要考滤10 00 01 .
7 楼 googya 2010-05-31  
beneo 写道
10 的 6 次方的字符串

凡是生成字符串,再去检查出dao字符串的,肯定都得超时



确实,这个问题都还没有考虑!!!
6 楼 beneo 2010-05-31  
10 的 6 次方的字符串

凡是生成字符串,再去检查出dao字符串的,肯定都得超时
5 楼 googya 2010-05-31  
googya 写道
相比之下,googya的代码显得相当的笨拙!
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法

我发现我完全的错了。位数搞错了。我的方法,每个字符产生的只有7位,而应当是8位。
4 楼 googya 2010-05-31  
相比之下,googya的代码显得相当的笨拙!
部分原因是不熟悉unpack这个方法!用的是,最直接、最原始的想法
3 楼 Hooopo 2010-05-31  
"youdao.com".unpack("B*").to_s.scan("dao".unpack("B*").to_s).size


PS:秦汉唐宋明的unpack("B*")很简洁。。
"youdao.com".unpack("C*").map{|x| "%08b" % x}.join也可以实现同样效果,不过罗嗦了点~

这里也有一个Base64编码相关的帖子:http://www.iteye.com/topic/286240

按照楼主的思路写了一个ruby版的实现:
def encode(str)
  keys = "abcdefghijklmnopqrstuvwxyz234567"
  str.unpack("C*").map{|b| "%08b" % b}.join.scan(/\d{1,5}/).map{|x| "0" * 3 + x.ljust(5,"0")}.map{|y| keys[y.to_i(2)].chr}.join
end

2 楼 googya 2010-05-31  
秦汉唐宋明 写道
 table = {'00'=>'a','01'=>'o','10'=>'d','11'=>' '}
 "abcedefgh".unpack('B*')[0].gsub!(/../){|s| table[s]}.scan('dao').length


有1年没写ruby代码了,练习一下

very nice,very smart!
1 楼 秦汉唐宋明 2010-05-31  
 table = {'00'=>'a','01'=>'o','10'=>'d','11'=>' '}
 "abcedefgh".unpack('B*')[0].gsub!(/../){|s| table[s]}.scan('dao').length


有1年没写ruby代码了,练习一下

相关推荐

    2010年有道难题资格赛试题3套

    标题 "2010年有道难题资格赛试题3套" 暗示了这是一个包含编程竞赛或逻辑思维挑战的资源包,特别是来自2010年网易有道的资格赛题目。有道是中国知名的在线学习平台,尤其以其编程挑战和逻辑测试闻名。这些试题可能...

    “一日三省”,2012 有道难题-网易创新大赛参赛作品,an Android App by Candy Group。.zip

    标题中的“一日三省”指的是一个2012年参与网易创新大赛的Android应用程序,由Candy Group团队开发。这个应用可能是一个以自我反思或个人成长为主题的软件,因为“一日三省”通常意味着每日自我检查三次,以促进自我...

    "有道"难题重复数另类解法

    "有道"难题重复数另类解法。如22是重复数,122也是重复数等。。。

    HNUSTC语言基础简单数据结构acm入门搜索PPT教案.pptx

    - 难题挑战:例如百度之星、有道难题等。 - 数学建模:有校内赛和全国比赛。 3. **参考书籍**: - 图书馆内有ACM相关的书籍资源。 - 在线资源:如OJOJ(Online Judge)提供了练习平台。 4. **实例解析**: - ...

    王汪-北京搜狐-Android开发-武汉大学研究生1

    在学术和荣誉方面,王汪表现出色,多次获得奖学金和奖项,包括国家励志奖学金、数学建模竞赛全国三等奖、嵌入式系统专题邀请赛全国二等奖、国家奖学金、科研优秀奖,以及有道难题-网易创新大赛全国三等奖和武汉大学...

    有道编程挑战题 网易

    ### 基于给定的信息理解Base64编码 #### Base64编码概念与原理 Base64是一种常见的用于在网络上传输8位字节数据的编码方式。它主要用于确保二进制数据能够通过只能安全传输文本数据的系统进行传输。...

    用python3 urllib破解有道翻译反爬虫机制详解

    综上所述,本文通过具体的实例,深入浅出地介绍了破解有道翻译反爬虫机制的整个过程,包括抓包分析、破解加密难题、模拟请求头、构造请求、签名生成以及响应处理等关键步骤,展示了Python3和urllib库在解决这一问题...

    中国普及教育有道难关.docx

    中国普及教育的道路上面临着多道难关,这些难题主要源自社会经济、文化观念以及教育资源的不均衡分配。陶行知先生深入分析了这些问题,并提出了相应的解决方案。 首先,女性教育是普及教育的一大难题。在旧中国,...

    有道词典美句.pdf

    7. 感恩的心态:无论面临何种困难,如编程难题或项目困境,感恩之心能帮助我们看到问题的积极面,找到解决方案。 8. 友谊与健康:良好的同事关系和社交网络对于减轻工作压力、保持心理健康在IT工作中同样重要。 9....

    有道词典美句参考.pdf

    7. **积极心态**:无论面对技术难题还是项目挫折,保持感恩和积极的心态,能帮助我们找到解决问题的新角度。 8. **友谊与健康**:良好的人际关系对IT从业者尤其重要,能缓解工作压力,提高工作效率和幸福感。 9. *...

    格物致知・数安有道 _ 红途GOPR平台正式发布.pdf

    首先,红途GOPR平台所推崇的“格物致知・数安有道”理念,是在深入分析当前网络安全和数据安全面临的挑战后提出的。随着数字经济的不断发展,数据安全已成为国家安全战略的重要组成部分。国家相关法律法规的密集出台...

    “协同”有道,“无人”驾成!——车路协同自动驾驶系统发展漫谈.pdf

    "车路协同自动驾驶系统发展漫谈" 车路协同自动驾驶系统是指通过车辆和道路基础设施之间的信息交换和协作...车路协同自动驾驶系统是智能交通管理和自动驾驶的重要技术,具有广泛的应用前景,但仍然面临一些挑战和难题。

    idea translation插件

    **Idea Translation插件详解** Idea Translation插件是一款针对IntelliJ IDEA集成开发环境的扩展工具,专门设计用于帮助开发者在编写代码时进行多语言翻译。...合理利用,可以有效解决跨语言开发中的难题。

    出国求生指南 翻译APP帮你“渡劫”.pdf

    然而,对于外语不太精通的人来说,语言沟通无疑是一大难题。这时,翻译APP就成为了出行必备的工具。随着技术的发展,翻译APP的功能日益增强,不仅包括传统的文本翻译,还增加了语音识别、拍照翻译、面对面翻译等功能...

    英文网站如何翻译成中文网站.docx

    总的来说,随着技术的发展,跨越语言障碍已经不再是一项难题。无论是通过2345王牌浏览器的翻译功能,还是使用其他工具,都能够帮助用户更便捷地访问和理解英文网站,从而拓宽知识视野,提升信息获取效率。

    OCR图片识别翻译软件.rar

    总结来说,OCR图片识别翻译软件是一款集成了OCR技术和多种在线翻译引擎的实用工具,它解决了扫描文档的文字提取和翻译难题,为用户提供了一站式的解决方案。无论是学术研究、商务沟通还是日常生活,都能大大提高我们...

    QTranslate.5.7.0.3

    无论是在学术研究、工作交流还是日常生活中的语言难题,QTranslate都能成为用户得力的语言助手,帮助我们跨越语言障碍,拓宽沟通的边界。在信息化时代,拥有一款如此高效、全面的翻译软件,无疑将提升我们的工作效率...

    搜霸对比在线翻译

    在当今全球化的时代,语言的交流障碍成为了信息传递的一大难题。随着科技的发展,翻译工具应运而生,为不同语言背景的人们提供了便利。市场上涌现出了众多在线翻译平台,如谷歌翻译、有道翻译、百度翻译等,它们以...

Global site tag (gtag.js) - Google Analytics