2010年5月23日

摘要: 问题:对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和。2个非空格字符的距离是它们的ASCII码之差的绝对值;空格与空格的距离为0,空格与其他字符的距离为一个定值k。在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符所产生的字符串。在字符串A和B的所有长度相同的扩展中,有一对距离最短的扩展,该距离称为字符串A和B的扩展距离。对于给定的字符串A和B,设计一个算法,计算其扩展距离。测试数据:输入:cmc snmn 2 (分别表示字符串A、B和定值k)输出:10解答:设字符串A和B的字串A[1...i]和B[1...j]的扩展距离是val(i, j); 阅读全文
posted @ 2010-05-23 22:56 android开发实例 阅读(2175) 评论(0) 推荐(0) 编辑
摘要: 问题:给定一个单向链表,设计一个时间优化并且空间优化的算法,找出该链表的倒数第m个元素。实现您的算法,注意处理相关的出错情况。m定义为当m=0时,返回链表最后一个元素。解答:这是一个难题,因为单向链表只能正向遍历,这个问题需要根据元素与链表尾的相对位置来找出该元素,但是当发现链表尾时,没有简单的办法回溯到倒数第m个元素。我们需要的是倒数第m个元素,所以,如果我们从某个元素开始,遍历了m个元素之后刚好到达链表末尾,那这个元素就是要找的元素。一种方法是简单的以这种方式检查每个元素,直到找到要找的元素为止。但这样同样的元素会被遍历多次,针对链表中大部分元素我们都会遍历m个元素,如果链表的长度是n的话 阅读全文
posted @ 2010-05-23 17:00 android开发实例 阅读(265) 评论(0) 推荐(0) 编辑
摘要: 问题:发现并修复下面C/C++函数中的缺陷,该函数是想从一个单向链表中删除头元素。void removeHead(Node *head){ delete head; head = head->next;}解答:缺陷发现策略:对于拿到的任何函数,考虑下面4个常见的问题:1)检查数据是否正确地进入了该函数;2)检查函数的每一行是否能正确工作;3)检查该函数的输出数据是否正确;4)检查常见的错误情况,如以指针为参数的函数在传入空指针时会失败。函数释放了head之后,有对head进行引用,错误;我们试着将这两行颠倒位置,就会导致head之后的元素被删除,而不是head。因此正确的方法是利用一个临 阅读全文
posted @ 2010-05-23 16:53 android开发实例 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 记住头元素:单向链表的头元素必须至始至终要记住,否则链表将会在内存中丢失。这意味着在链表第一个元素之前插入新元素或删除链表第一个元素时,指向链表头的指针或引用必须更新。在C/C++中,很容易因误用指针而犯错误,如下面代码,它在链表的前面插入一个元素:bool insertInFront(IntElement *head, int data){ IntElement *newItem = new IntElement; if(!newItem) return false; newItem->data = data; newItem->next = head->next; hea 阅读全文
posted @ 2010-05-23 16:48 android开发实例 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 问题:一个链表要么以NULL结尾(非循环的),要么以循环结尾(循环的),请编写一个函数,接受链表的头指针作为参数,确定该链表是循环的还是非循环的。如果链表是循环的,函数返回true,如果是非循环的,函数返回false。注意,不能以任何方式修改链表。解答:这两种链表的区别在与它们的末尾。在非循环链表中,末尾节点是以NULL结束的,因此只要遍历链表,直到找到一个以NULL结尾的节点就行;但在非循环链表中,仅仅遍历链表,就会陷入死循环中。所以我们先研究一下末尾节点。对于循环链表中末尾节点指向的节点,还有另一个指针(头指针)指向它。这意味着有两个指针指向了同一个节点,这个节点是唯一一个有两个元素指向的 阅读全文
posted @ 2010-05-23 11:40 android开发实例 阅读(459) 评论(0) 推荐(1) 编辑

导航