出题:给定一个乱序链表,节点值为ASCII字符,但是其中有重复项,要求去除重复项并保证不改变剩余项的原有顺序;

分析:创建一个256(2^8)大小的bool数组,初始化为false,顺序读取链表,将字母对应位置为false的重新标记为true并保留节点,将字母对 应位置为true的保持并删除节点;时间复杂度为O(N),空间复杂度为常量。注意删除节点和不删除节点的情况下,pre和cur的移动操作不相同;

解题:

 1 struct Node {
 2         char value;
 3         Node* next;
 4 };
 5 void DeleteDup(Node *head) {
 6         if(head==NULL) {
 7                 printf("\nthe list is NULL");
 8                 return;
 9         }
10
11         Node *pre=NULL, *cur=head;
12         /**
13          * 设置一个256的bool数组记录char是否
14          * 已经出现
15          * */
16         bool haveChar[256];
17         for(int i=0;i<256;i++)
18                 haveChar[i]=false;
19         /**
20          * 如果haveChar对应为true,说明当前节点
21          * 的值已经出现过,则进行删除
22          * 如果haveChar对应为false,说明当前节点
23          * 的值第一次出现,则将其设置为true
24          * */
25         while(cur!=NULL) {
26                 /**
27                  * 注意删除节点的情况和不删除节点的情况
28                  * pre和cur的需要不同的处理
29                  * */
30                 if(!haveChar[(cur->value)-'0']) {
31                         haveChar[(cur->value)-'0']=true;
32                         pre=cur;
33                         cur=cur->next;
34                 }
35                 else {
36                         pre->next=cur->next;
37                         delete cur;
38                         cur=pre->next;
39                 }
40         }
41 }
42 int main() {
43         Node *a1=new Node();a1->value='a';
44         Node *a2=new Node();a2->value='d';
45         Node *a3=new Node();a3->value='s';
46         Node *a4=new Node();a4->value='d';
47
48         a1->next=a2;a2->next=a3;
49         a3->next=a4;a4->next=NULL;
50
51         DeleteDup(a1);
52
53         Node *temp=a1;
54         while(temp!=NULL) {
55                 printf("\n%c",temp->value);
56                 temp=temp->next;
57         }
58         return 0;
59 }

出题:给定两个已排序的数组,要求找出共同的元素;

分析:

  • 如果两个数组大小接近,则分别使用指针first和second遍历两个序列,由于数组已经排序,所以遍历过的元素不会再次访问,所以时间复杂度为O(M+N);
  • 如果两个数组大小差距较大,则在针对小数组中的每个元素在大数组中使用二分查找(每处理一个元素之后,大数组的范围都可以调整到上一个元素的后面),时间复杂度为O(NlogM),N足够小(M>N^2);

解题:

 1 /**
 2  * 时间复杂度O(M+N)
 3  * */
 4 void FindCommonInt1(int *first, int fl, int *second, int sl) {
 5         int ft=0, st=0;
 6         while (ft<fl && st<sl) {
 7                 if(first[ft]>second[st]) {
 8                         st++;
 9                 } else if(first[ft]<second[st]) {
10                         ft++;
11                 } else {
12                         printf("\n%d",first[ft]);
13                         ft++;st++;
14                 }
15         }
16 }
17 /**
18  * 时间复杂度小于O(NlogM),其中M不断变小
19  * */
20 void FindCommonInt2(int *first, int fl, int *second, int sl) {
21         int start=0, end=fl-1;
22         int s,e,m;
23         for(int i=0;i<sl;i++) {
24                 s=start;e=end;
25                 while(s<=e) {
26                         m=(s+e)/2;
27                         if(first[m]>second[i]) {
28                                 e=m-1;
29                         } else if(first[m]<second[i]) {
30                                 s=m+1;
31                         } else {
32                                 printf("\n%d",first[m]);
33                                 start=m+1;
34                                 break;
35                         }
36                 }
37         }
38 }
39 int main() {
40         int first[]={1,2,3,4,5,6,10,11,12};
41         int second[]={1,4,9,10};
42         FindCommonInt2(first, 9, second, 4);
43         return 0;
44 }

转载于:https://www.cnblogs.com/leo-chen-2014/p/3747209.html

笔试算法题(28):删除乱序链表中的重复项 找出已经排好序的两个数组中的相同项...相关推荐

  1. 目录:名企笔试 + 算法题

    名企笔试:美团2016招聘笔试(股票交易日) 名企笔试:搜狐2016招聘笔试题(扎金花) 名企笔试:凤凰网2015招聘(二分查找) 名企笔试:4399游戏校招笔试题(快速排序) 名企笔试:蘑菇街201 ...

  2. 2023年春招热门笔试算法题(C++)

    内容整理自网络,侵权联系删除 1.链表反转 输入:{1,2,3} 返回值:{3,2,1} struct ListNode {int val;struct ListNode *next;ListNode ...

  3. Re: 一著名软件公司的java笔试算法题!

    主 题: Re: 一著名软件公司的java笔试算法题! 作 者:   szlhj () 等 级:   信 誉 值:   95 所属论坛:   Java J2SE / 基础类 问题点数:   20 回复 ...

  4. 【实习笔试面试题】2013网易互联网实习笔试算法题-找出最大连续自然数个数

    找出最大连续自然数个数 搜集者:江南烟雨 E-Mail:xiajunhust@gmail.com 本题为网易互联网暑期实习生笔试算法题. 凭记忆记录下来的题目,如违反网易版权请邮件联系,本人会删除. ...

  5. LeetCode 547. Friend Circles--Python解法--笔试算法题

    题目地址:Friend Circles - LeetCode There are N students in a class. Some of them are friends, while some ...

  6. 秋招笔试算法题——电容充电

    秋招笔试算法题--电容充电 牛客网<笔试真题精选2019> 字节跳动2018秋招笔试题4 [题目描述]有一台用电容组成的计算器,其中每个电容组件都有一个最大容量值(正整数). 对于单个电容 ...

  7. C++(面试题):给40亿个不重复的无符号整数,没排过序,如何快速判断一个数是否在这40亿个数中

    给40亿个不重复的无符号整数,没排过序,给你一个无符号整数,如何快速判断这个数是否在这40亿个数中? 首先看到这个题第一个想到的就是遍历一遍,看这个数在不在.但是这样的时间复杂度太高了O(N),数据量 ...

  8. 编程笔试(解析及代码实现):序列重排之给一个长度为n的序列A,求找出某种排列方式使得相邻两个数的差值之和最大并求出该最大值

    编程笔试(解析及代码实现):序列重排之给一个长度为n的序列A,求找出某种排列方式使得相邻两个数的差值之和最大并求出该最大值 目录 题目描述 代码实现 题目描述 序列重排:给一个长度为n的序列A,求找出 ...

  9. php两个数组去掉相同的,php如何删除两个数组中相同的数据

    php如何删除两个数组中相同的数据 发布时间:2021-03-12 10:27:42 来源:亿速云 阅读:77 作者:小新 这篇文章给大家分享的是有关php如何删除两个数组中相同的数据的内容.小编觉得 ...

最新文章

  1. 详解@EnableEurekaServer和@EnableDiscoveryClient 或 @EnableEurekaClient注解
  2. leetcode 525. Contiguous Array | 525. 连续数组(Java)
  3. 用Blazor技术封装G2Plot实现Charts组件
  4. text 两端对齐 小程序_小程序实现文字两端对齐
  5. 【摘录】《程序设计导引及在线实践》之排列
  6. Flash教程:多种图片切换效果
  7. UVA12439 February 29【日期计算】
  8. Subversion vs Subclipse
  9. 记Dorado7学习(5)
  10. uncode-schedule 学习
  11. 从祖师级到新生代,48位开发者的“武功秘籍”
  12. Python基础——PyCharm版本——第八章、文件I/O(核心2——JSON序列化与反序列化——超重点)
  13. 【Microsoft Azure 的1024种玩法】十五.通过Web浏览器对Auzre VM 服务器运维管理
  14. Microsoft Office Document Image Writer 和 Microsoft XPS Document Writer (Office组件轻松把PDF文件转成Word文档)...
  15. IO子系统(一) — 块设备驱动程序
  16. Bootstrap学习之表单
  17. 文物3D模型互动展示 | 足不出户,即可领略九龙壁的美轮美奂
  18. 运算符“||”与“|”,“”和“”的区别 (附带各类位运算符号详解(、|、^、~、<<、>>、>>>)
  19. centos 调教日记
  20. Thread类的基本用法

热门文章

  1. 如何开启/关闭SMTP路由调试
  2. android Arrays.fill()的使用
  3. String.format()的使用
  4. git-flow的分支管理 (Git branching model)
  5. CSS3 -webkit-transition(属性渐变)
  6. Android模拟位置出错IllegalArgumentException: Incomplete location object, missing timestamp or accuracy?
  7. OO第三单元JML总结
  8. MacOs桌面自动被打乱的原因
  9. Centos7.X通过rpm包安装Docker
  10. PHP常用的数组函数