现在的位置: 首页 > 综合 > 正文

【每日N题】字符过滤&链表复制

2014年01月01日 ⁄ 综合 ⁄ 共 1140字 ⁄ 字号 评论关闭

前言:以后争取每天搞一两个有意思的题做做

1、 删除字符串开始及末尾的空白符,并且把数组中间的多个空格(如果有)符转化为1个。

解答:

【方案一】如果这是实际工作中用于数据清洗,显然可以直接用个脚本处理不用什么开发。不多说直接上代码:

原始数据:
[work@localhost test]$cat file
   aa   bb  a
jj  dd  kk
  ll  kk   o
处理脚本:

验证:
[work@localhost test]$cat file |sh filter.sh
aa bb a
jj dd kk
ll kk o

【方案二】显然这不是面试官的目的,他肯定希望你的回答思路是,运用什么算法去解析出来这个字符串。

对于每一个读入的数据,定义一个head和temp,tail,head指向第一个非空字符地址,temp和tail向后移动,遇到第一个空格时temp不再移动,tail继续直到非空格,此时(1)tail如果是\n,则temp+1付为\n退出;(2),如果不是则temp+1所指向字符赋值为tail所指向数据;依次类推。

一次遍历可达到目的。

2、链表克隆。链表的结构为:

    typedef struct list {

            int data; //数据字段

            list *middle; //指向链表中某任意位置元素(可指向自己)的指针

            list *next;//指向链表下一元素

    } list;

解答:

       这个显然不是个链表,而是个有向有环图。

         其实这里有个问题并没有明确,就是只是复制图的结构,还是说连里面的数据也一同复制了。因为假如只是复制图结构的话,我们可以用里面的data变量作为标志,表示此节点是否被读过,这样简单多了。

(1)      假设我们只复制图结构;

两个图我们分别叫他new_list和old_list,我们在old_list中进行递归遍历:

遍历过程:

【a】      每访问一个节点,如果发现此节点没访问过,则将其data变量置为已访问,否则返回访问失败;

【b】      递归访问middle;如果访问成功则同时在new_list中新建一个节点并把地址付给当前节点的middle,同时new_list也同样递归进入当前的middle节点;

【c】      递归访问next;如同middle;

(2)      复制图结构的同时,复制里面的数据;

我们要复制里面的数据,也就是说data变量要存数据,我们不能破坏他。这时,我们需要外部引入标志,比如我们用一个set或vector保存标志,里面存储的是old_list中被访问过的节点的地址;

总结:随便写写的,让自己有点事做要不又玩了,可能方法有考虑不周的地方,或有更好方案。如有异议,请赐教。

抱歉!评论已关闭.