免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10314 | 回复: 50
打印 上一主题 下一主题

两道题,问了N多人,没结果,再问一下看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-10 16:29 |只看该作者 |倒序浏览
1) Write a program to identify all the repetitive patterns in a string of
charaters (INPUT).  The string is only composed of A,C,G,T characters.  The
maximum length of string is 10000.  The minimum length of repeat is 10
characters.   Output: position, size, and patterns.  Here is an example:
1)写一个程序,识别字符串中所有的重复片段(重复模式),字符串由A,C,G,T组成,字符串最长为10000,随机产生。重复的片段最小是10个符串。输出:位置,大小,和片段。如下:
String:
TAAAAACTCGGGGT AAAAACTCGGGGAAAA
Repeat:
Repeat: AAAAACTCGGGG, Size: 12, Start Positions: 2, 15

解释:如这就就有两个重复(空格格开了):T  AAAAACTCGGGG  T AAAAACTCGGGG AAAA
这两个重复位置分别在字符串的2和15位,大小为12



2) Write a program to identify all the INVERTED repetitive patterns (e.g.
TAACCG =>; GCCAAT) in a string of character (INPUT).  The string is only
composed of A,C,G,T characters.  The maximum length of string is 10000.  The
minimum length of repeat is 10 characters.   Output: position, size, and
patterns.   Here is an example:

写一个程序识别所有的反向重复,如TAACCG =>; GCCAAT,也就是前面的反过来就是后面的字符串。和上面一样,字符串最长为10000,随机产生,最小反向重复片段为10,输出位置,大小,和片段,如下:
String:
CAAAAACGAGGGGTTTGGGGAGCAAAAA
Inverted Repeat:
Inverted Repeat: AAAAACGAGGGG, Size: 12, Start Positions: 17, 2

解释:如上面,C  AAAAACGAGGGG  TTT   GGGGAGCAAAAA
AAAAACGAGGGG和GGGGAGCAAAAA分别是反向重复,分别在2和17位上,大小为12。

论坛徽章:
0
2 [报告]
发表于 2004-12-10 16:58 |只看该作者

两道题,问了N多人,没结果,再问一下看看

求源程序吗?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2004-12-10 17:01 |只看该作者

两道题,问了N多人,没结果,再问一下看看

^_^,又发帖子啦。下午闲的时候写了一个。这样做是犯规的,可是,最近没啥写的,看书又累了,挺郁闷的,随手抓过来就写了,当练习发泄了。班长见谅啊。

  1. #include <stdio.h>;
  2. #include <stdlib.h>;
  3. #include <assert.h>;
  4. #include <string.h>;
  5. #include <time.h>;

  6. #define MAX     100
  7. #define TRUE    1
  8. #define FALSE   0

  9. #define INVERTIED

  10. typedef int     BOOL;

  11. void make_queue(char *src);
  12. BOOL str_check(char *str);
  13. void do_vertied(char *src, char *str);
  14. void do_invertied(char *src, char *str);
  15. void str_change(char *str, char *tmp);

  16. int main(void) {
  17.         char    src[MAX], str[MAX];
  18.         BOOL    flag;
  19.         make_queue(src);
  20.         printf("source queue: %s\n", src);
  21.         printf("input a string to search: ");

  22.         scanf("%s", str);
  23.         flag = str_check(str);
  24.         while (flag == FALSE) {
  25.                 printf("Please input string with A, C, G or T!\n");
  26.                 scanf("%s", str);
  27.                 flag = str_check(str);
  28.         }

  29. #ifdef VERTIED
  30.         do_vertied(src, str);
  31. #else
  32.         do_invertied(src, str);
  33. #endif
  34.         exit(0);
  35. }

  36. /*
  37. * check the string input to show wether the string is comfortable.
  38. *
  39. */
  40. BOOL str_check(char *str) {
  41.         char    ch;
  42.         int     i;

  43.         assert(str != NULL);

  44.         i = 0;
  45.         ch = str[i++];
  46.         while (ch != '\0') {
  47.                 switch (ch) {
  48.                         case 'A' :
  49.                         case 'C' :
  50.                         case 'G' :
  51.                         case 'T' :
  52.                                 break;
  53.                         default :
  54.                                 return FALSE;
  55.                 }
  56.                 ch = str[i++];
  57.         }
  58.         return TRUE;
  59. }

  60. /*
  61. * to make a comfortable source string.
  62. *
  63. */
  64. void make_queue(char *src) {
  65.         char    tmp[4], *s;
  66.         time_t  t;
  67.         int     random, tip, size, i, pos;

  68.         assert(src != NULL);

  69.         memset(src, 0x00, MAX);

  70.         // init the tmp array.
  71.         tmp[0] = 'A';
  72.         tmp[1] = 'C';
  73.         tmp[2] = 'G';
  74.         tmp[3] = 'T';

  75.         // init the random seed.
  76.         t = time(NULL);
  77.         srand((unsigned int)t);

  78.         // make a temp space to store the source string.
  79.         tip = RAND_MAX%MAX;     // to make balance to every number < 1000.
  80.         random = rand();
  81.         if (random >; tip) {
  82.                 size = random%MAX;
  83.                 s = (char *)calloc(size, sizeof(char));
  84.                 if (s == NULL) {
  85.                         perror("make_queue, s malloc");
  86.                         exit(1);
  87.                 }
  88.         }

  89.         // fill the store space.
  90.         tip = RAND_MAX%4;
  91.         i = 0;
  92.         while (i < size) {
  93.                 random = rand();
  94.                 if (random >; tip) {
  95.                         pos = random%4;
  96.                         s[i++] = tmp[pos];
  97.                 }
  98.         }

  99.         // s ==>;>; src.
  100.         strcpy(src, s);
  101.         free(s);
  102.         return ;
  103. }

  104. /*
  105. * to find the vertied string in the source.
  106. *
  107. */
  108. void do_vertied(char *src, char *str) {
  109.         char    *pos;
  110.         int     position[MAX], size, count, i;

  111.         assert((src != NULL) && (str != NULL));

  112.         size = strlen(str);
  113.         memset(position, 0x00, MAX*sizeof(int));

  114. #ifdef VERTIED
  115.         printf("vertied string: %s, ", str);
  116. #else
  117. {
  118.         char    *tmp;
  119.         tmp = strdup(str);
  120.         str_change(str, tmp);
  121.         printf("invertied string: %s, ", tmp);
  122.         free(tmp);
  123. }
  124. #endif
  125.         printf("size: %d, ", size);

  126.         count = 0;
  127.         i = 0;
  128.         pos = strstr(src, str);
  129.         if (pos == NULL) {
  130.                 printf("no string in the source!\n");
  131.                 return ;
  132.         }

  133.         while (pos != NULL) {
  134.                 count++;
  135.                 position[i++] = pos - src + 1;
  136.                 pos = strstr(pos + size, str);
  137.         }

  138.         printf("position: ");
  139.         i = 0;
  140.         while (position[i] >; 0) {
  141.                 printf("%d, ", position[i++]);
  142.         }
  143.         printf("\n");
  144.         return ;
  145. }

  146. /*
  147. * to find the invertied string in the source.
  148. *
  149. */
  150. void do_invertied(char *src, char *str) {
  151.         char    *tmp;
  152.         tmp = (char *)malloc(strlen(str));
  153.         if (tmp == NULL) {
  154.                 perror("do_invertied, tmp malloc");
  155.                 exit(1);
  156.         }
  157.         str_change(str, tmp);
  158.         do_vertied(src, tmp);
  159.         return ;
  160. }

  161. /*
  162. * to change the sequence of the str string .
  163. *
  164. */
  165. void str_change(char *str, char *tmp) {
  166.         int     len, i;
  167.         len = strlen(str);
  168.         for (i = 0; i < len; i++){
  169.                 tmp[len-i-1] = str[i];
  170.         }
  171.         tmp[len] = '\0';
  172. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2004-12-10 17:29 |只看该作者

两道题,问了N多人,没结果,再问一下看看

aero真是强人,pfpf!

论坛徽章:
0
5 [报告]
发表于 2004-12-10 19:37 |只看该作者

两道题,问了N多人,没结果,再问一下看看

超过 4 亿个整数按照二进制方式存放到到一个文件中,对所有整数按照大小排序并保存到新文件中
========================================

写个 M 进制到 N 进制转换程序('0'-'9'表示 0-9,大写 'A'-'Z' 表示 10-35)。假定 M<36,N<36,只做整数部分。

========================================

最近面了很多家公司。。。
我觉得这两到题还是比较有难度的。。。。

论坛徽章:
0
6 [报告]
发表于 2004-12-11 09:00 |只看该作者

两道题,问了N多人,没结果,再问一下看看

还是C这边的大侠比较狠,呵呵~~~

论坛徽章:
0
7 [报告]
发表于 2004-12-11 09:23 |只看该作者

两道题,问了N多人,没结果,再问一下看看

原帖由 "xhl" 发表:
超过 4 亿个整数按照二进制方式存放到到一个文件中,对所有整数按照大小排序并保存到新文件中

用hash最方便。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2004-12-11 12:45 |只看该作者

两道题,问了N多人,没结果,再问一下看看

to aero:
这个程序似乎不符合要求,楼主是要随机产生一个10000长度的字符串,然后自动查找所有同一样的字符串的开始位置.我想了一下,觉得处理起来不难(只是一些细节容易出错),但效率嘛....

论坛徽章:
0
9 [报告]
发表于 2004-12-11 13:04 |只看该作者

两道题,问了N多人,没结果,再问一下看看

有意思,效率应该不是问题,楼主的问题一看就知道是搞基因工程的,搞基因工程的都有大型机的:)

论坛徽章:
0
10 [报告]
发表于 2004-12-11 19:45 |只看该作者

两道题,问了N多人,没结果,再问一下看看

原帖由 "THEBEST" 发表:
to aero:
这个程序似乎不符合要求,楼主是要随机产生一个10000长度的字符串,然后自动查找所有同一样的字符串的开始位置.我想了一下,觉得处理起来不难(只是一些细节容易出错),但效率嘛....



呵呵,是有点不一样,其实我觉得这个程序写出来要好好验证,因为有很多人为想不到的因素。其实这个程序要用几百条代码写出来好象不是很容易,一家之言。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP