网上看到一道奇怪的题,分享一下:http://hero.csdn.net/Question/Details?ID=307&ExamID=302

  • 发布公司:CSDN
  • 有 效 期:2014-02-26至2014-03-28
  • 难 度 等 级:
  • 答 题 时 长:120分钟
  • 编程语言要求:C C++ Java C#

题目详情

假设字符串A=“^__^" (4个字符),B="T.T"(3个字符),我们进行如下步骤:

(1) 把A接到B的后面得到字符串C (按样例C="T.T^__^")

(2) 令A=B,B=C

不断重复步骤(1)(2)得到的字符串是无穷的。

求这个串的第n个字符。(0<n<2^63)

分析:

1.不断重复步骤(1)(2)得到的字符串是无穷的!!现在要求的是这个无穷串的第n个字符!

2.(0<n<2^63)不是个小数,要记录整个过程,考虑到节省空间,最好用二进制来记录;

3.简单举例:n=8时

字符串为:

1:                                A=“^__^"                B="T.T"

2:C="T.T^__^"            A="T.T"                  B="T.T^__^"

3:C="T.T^__^T.T"      A=="T.T^__^"         B="T.T^__^T.T"

…………

上式中B="T.T^__^T.T"  ,第n=8位是符号”T“;

算法分析:

1.借鉴计算机网络通信的编码思想,我们用四位二进制数1100表示A,三位二进制数100表示B;

2.用二进制位来记录这个长字符串,原来是 B="T.T^__^T.T" ,现在存为B=”1001100“;

3.如何通过B=”1001100“判断B的第n位是那个字符呢?

当n=6时

B=”1001100“的第6位是0,则往前走k位遇到第一个”1“,然后判断1前面是1还是0,如果两个1则表明第n个字符是属于串A的(A=1100),如果前面是0,只有一个1则在B内(B=100);然后通过移动的位数k来判断n是A或B串的第几个字符;

还有另外一个思路:

就是用两个二进制数,一个用来判断n位字符属于A还是属于B,另一个二进制数判断n位字符属于A或B的第几个符号;

比如A=1111,B=000,当n位是1就知道是A,0就表示该符号在B内;

然后用A=1000,B=100表示在A或B的第几位,

比如  10001001000

|     (左侧符号指向0,我们就向前读取,由几个0就是串的第几位)

基本思路不是很难,但代码一写陷阱多多!下面就献上代码把:

#include <stdlib.h>
#include <stdio.h>
#include <string.h> char FUN(const char *A,char *B,int N){
int lenA = strlen(A);
int lenB = strlen(B);
if(lenA< || lenB<) return '\0';//长度小于3时候retA,retB的编码不支持
int retA = <<(lenA-);//用三位二进制100表示A,四位二进制1100表示B.
int retB = <<(lenB-);
// printf("reta=%d,retb=%d",retA,retB);
while(lenB < N){
int retC = ((retB<<(lenA)) | retA);//C=BA;
int lenC = lenA + lenB;
retA = retB;lenA = lenB;
retB = retC;lenB = lenC;
}
int k = lenB - N;
if((retB & (<<k))){//该位bit==1
if((retB & (<<(k+)))) return B[];//左侧bit==11,B,N=2
else{//左侧bit==0
if((retB & (<<(k-)))) return B[];//右侧bit=1,011,B,N=1
else return A[];//右侧bit=0,010,A,N=1
}
}
else{//该位==0
int count = ;
while(!(retB & (<<k))){
count++; k++;
}
if((retB & (<<(k+)))) return B[count+];
else return A[count];
}
return 'x';
} int main(){
char *A = "^__^";
char *B = "T.T";
int N = ;
int i=;
for(;i<=N;i++){
char ret = FUN(A,B,i);
printf("i=%d,ret=%c\n",i,ret);
}
return ;
}

输出结果

xu@xu-ThinkPad-X61:~/algorithm$ ./a.out
i=1,ret=T
i=2,ret=.
i=3,ret=T
i=4,ret=^
i=5,ret=_
i=6,ret=_
i=7,ret=^
i=8,ret=T
i=9,ret=.
i=10,ret=T
i=11,ret=T
i=12,ret=.
i=13,ret=T
i=14,ret=^
i=15,ret=_
i=16,ret=_
i=17,ret=^
i=18,ret=T
i=19,ret=.
i=20,ret=T

恩 welldone!!

无穷字符串问题--CSDN上的面试题(原创)的更多相关文章

  1. CSDN上下载的一些关于Android程序调用Webservice执行不成功的问题

    今天从书上和CSDN上找了几个关于android调用webservice的样例,这些样例从代码来看.没不论什么错误,可是就是执行不成功.分析了android调用web接口的写法,发现这些样例在调用的时 ...

  2. CSDN上最火的android项目

    CSDN上最火的android项目 直接拿来用!最火的Android开源项目(二) 直接拿来用最火的android开源项目(1)

  3. 客户端上显示csdn上的各类别下的的文章列表 (制作csdn app 三)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23597229 今天将在Android 使用Fragment,ViewPagerI ...

  4. python目标定位(借鉴csdn上大神)

    写博客是为了记录下来,毕竟好多东西记不住,看过就忘了,收藏又太多,还不如搬运到自己博客下面,随时可翻~~~ 近期再学目标识别与定位,看着原理都很简单,但是真自己做,又觉得困难重重. csdn上一个大神 ...

  5. 大家好,我是一个热爱编程的大二在读生,今天来移植一下CSDN上的博客

    今天开了博客园,将原来再CSDN上的博客移植一下,嘿嘿嘿.

  6. 自学Python2.1-基本数据类型-字符串str(object) 上

    自学Python之路 自学Python2.1-基本数据类型-字符串str(object) 上 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串 ...

  7. 这些年我在技术路上做过最虚伪愚蠢的事情,就是在CSDN上刷屏赚分

    现在似乎Github成了所谓技术人士的新宠,之前是博客,更早则是论坛. CSDN是众多技术论坛里比较突出的一个,人多高手也多,很多问题都能得到满意的回答. 谁都希望自己卓尔不群,我也不例外,我也想像那 ...

  8. PHP截取中文字符串不出现?号的解决方法[原创]

    PHP截取中文字符串不出现?号的解决方法[原创] 大 | 中 | 小 [不指定 -- : | by 张宴 ] [文章作者:张宴 本文版本:v1. 最后修改: 转载请注明出处:http://blog.z ...

  9. 抓取csdn上的各类别的文章 (制作csdn app 二)

    转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/23532797 这篇博客接着上一篇(Android 使用Fragment,View ...

随机推荐

  1. Middleware详解

    Middleware详解 在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章 ...

  2. [LeetCode] 033. Search in Rotated Sorted Array (Hard) (C++)

    指数:[LeetCode] Leetcode 解决问题的指数 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 033. ...

  3. 【转】UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39777951 在本人之前的一篇文章<<Appium基于安卓的各种FindEle ...

  4. 在Cocos2d-x正在使用SQLlite数据库

    SQLite,它是一个轻量级的数据库,合规ACID的关系型数据库管理系统,它的设计目标是嵌入式的,并且眼下已经在非常多嵌入式产品中使用了它,它占用资源非常的低.在嵌入式设备中,可能仅仅须要几百K的内存 ...

  5. jquery+css3打造一款ajax分页插件

    原文:[原创]jquery+css3打造一款ajax分页插件 最近公司的项目将好多分页改成了ajax的前台分页以前写的分页插件就不好用了,遂重写一个 支持IE6+,但没有动画效果如果没有硬需求,个人认 ...

  6. 导出DBF,并且提供下载 .

    原文:导出DBF,并且提供下载 . 导出DBF,并且提供下载 #region Declare string mFilePath = MapPath("../DataTmp/");  ...

  7. 创建GitHub技术博客

    创建GitHub技术博客全攻略 githubio技术博客网站生成 说明: 首先,你需要注册一个 github 账号,最好取一个有意义的名字,比如姓名全拼,昵称全拼,如果被占用,可以加上有意义的数字.本 ...

  8. poj 2513 Colored Sticks(欧拉路径+并检查集合+特里)

    题目链接:poj 2513 Colored Sticks 题目大意:有N个木棍,每根木棍两端被涂上颜色.如今给定每一个木棍两端的颜色.不同木棍之间拼接须要颜色同样的 端才干够.问最后是否能将N个木棍拼 ...

  9. SQL点滴11—重置win7登录密码影响SQL登录

    原文:SQL点滴11-重置win7登录密码影响SQL登录 2011-04-20  修改机器登录密码后不能登录SQL Server 今天发现一个很有趣的现象.公司的电脑每两个月就会提示重置登录密码,今天 ...

  10. WIN7远程桌面重启、关机

    在使用远程桌面访问Win7系统时会发现一个小问题,在xp远程桌面中存在的重启和关机菜单在win7远程桌面中不见了,如图: 这也给我们的使用带来了一些小小的麻烦,但实际上微软依然保留了命令行的方式来实现 ...