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

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

解题:

 struct Node {
char value;
Node* next;
};
void DeleteDup(Node *head) {
if(head==NULL) {
printf("\nthe list is NULL");
return;
} Node *pre=NULL, *cur=head;
/**
* 设置一个256的bool数组记录char是否
* 已经出现
* */
bool haveChar[];
for(int i=;i<;i++)
haveChar[i]=false;
/**
* 如果haveChar对应为true,说明当前节点
* 的值已经出现过,则进行删除
* 如果haveChar对应为false,说明当前节点
* 的值第一次出现,则将其设置为true
* */
while(cur!=NULL) {
/**
* 注意删除节点的情况和不删除节点的情况
* pre和cur的需要不同的处理
* */
if(!haveChar[(cur->value)-'']) {
haveChar[(cur->value)-'']=true;
pre=cur;
cur=cur->next;
}
else {
pre->next=cur->next;
delete cur;
cur=pre->next;
}
}
}
int main() {
Node *a1=new Node();a1->value='a';
Node *a2=new Node();a2->value='d';
Node *a3=new Node();a3->value='s';
Node *a4=new Node();a4->value='d'; a1->next=a2;a2->next=a3;
a3->next=a4;a4->next=NULL; DeleteDup(a1); Node *temp=a1;
while(temp!=NULL) {
printf("\n%c",temp->value);
temp=temp->next;
}
return ;
}

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

分析:

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

解题:

 /**
* 时间复杂度O(M+N)
* */
void FindCommonInt1(int *first, int fl, int *second, int sl) {
int ft=, st=;
while (ft<fl && st<sl) {
if(first[ft]>second[st]) {
st++;
} else if(first[ft]<second[st]) {
ft++;
} else {
printf("\n%d",first[ft]);
ft++;st++;
}
}
}
/**
* 时间复杂度小于O(NlogM),其中M不断变小
* */
void FindCommonInt2(int *first, int fl, int *second, int sl) {
int start=, end=fl-;
int s,e,m;
for(int i=;i<sl;i++) {
s=start;e=end;
while(s<=e) {
m=(s+e)/;
if(first[m]>second[i]) {
e=m-;
} else if(first[m]<second[i]) {
s=m+;
} else {
printf("\n%d",first[m]);
start=m+;
break;
}
}
}
}
int main() {
int first[]={,,,,,,,,};
int second[]={,,,};
FindCommonInt2(first, , second, );
return ;
}

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

  1. 笔试算法题(46):简介 - 二叉堆 & 二项树 & 二项堆 & 斐波那契堆

    二叉堆(Binary Heap) 二叉堆是完全二叉树(或者近似完全二叉树):其满足堆的特性:父节点的值>=(<=)任何一个子节点的键值,并且每个左子树或者右子树都是一 个二叉堆(最小堆或者 ...

  2. javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)

    主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除 ...

  3. C# 比较两个数组中的内容是否相同的算法

    这里要比较的是两个数组中的内容是否相同,以int数组为例 int[] Arraya=new[] {1,2,3,4,5} int[] Arrayb=new[] {5,3,2,1,4} 以上两个数组内的值 ...

  4. 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

    今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...

  5. 笔试算法题(19):判断两条单向链表的公共节点 & 字符集删除函数

    出题:给定两个单向链表的头结点,判断其是否有公共节点并确定第一个公共节点的索引: 分析: 由于是单向链表,所以每个节点有且仅有一个后续节点,所以只可能是Y型交叉(每条链表中的某个节点同时指向一个公共节 ...

  6. 笔试算法题(17):奇偶数分置数组前后段 & 反序访问链表

    出题:输入一个数组,要求通过交换操作将奇数索引的元素调整到数组前半部分,偶数索引的元素调整到数组后半部分: 分析: 当然如果没有额外要求的话很容易实现,最好使用In-Place的实现策略:考虑插入排序 ...

  7. 笔试算法题(18):常数时间删除节点 & 找到仅出现一次的两个数字

    出题:给定链表的头指针和一个节点指针,要求在O(1)的时间复杂度下删除该节点 分析: 如果需要删除的节点为A,其前序节点为A-,其后续节点为A+,所以删除A之后,需要使得A-的下一个节点就是A+,常规 ...

  8. 笔试算法题(03):最小第K个数 & 判定BST后序序列

    出题:输入N个整数,要求输出其中最小的K个数: 分析: 快速排序和最小堆都可以解决最小(大)K个数的问题(时间复杂度为O(NlogN)):另外可以建立大小为K的最大堆,将前K个数不断插入最大堆,对于之 ...

  9. 笔试算法题(25):复制拥有多个指针的链表 & 判断二元树B是否为A的子树

    出题:定义一个复杂链表:在单向链表的基础上,每个节点附加一个指向链表中其他任意节点的指针sibling,实现CNode* Clone(Cnode *head)函数复制这个复杂链表: 分析: 解法1:将 ...

随机推荐

  1. asp.net mvc razer

    Asp.net MVC Razor模板引擎技巧分享 http://www.cnblogs.com/JustRun1983/p/3545303.html 全新的membership框架Asp.net I ...

  2. strcpy(转载)

    转自:http://www.kuqin.com/clib/string/strcpy.html 原型:extern char *strcpy(char *dest,char *src); 用法:#in ...

  3. bzoj2131: 免费的馅饼(树状数组)

    Description Input 第一行是用空格隔开的二个正整数,分别给出了舞台的宽度W(1到10^8之间)和馅饼的个数n(1到10^5). 接下来n行,每一行给出了一块馅饼的信息.由三个正整数组成 ...

  4. 《Google软件测试之道》心得笔记1

    Google软件测试介绍 把开发和测试融合在一起——开发和测试必须同时展开 开发人员自己要对自己写的代码负责,比专职的测试人员更适合做测试工作. 测试开发工程师SET 对于Google拥有很少量的测试 ...

  5. LBP特征 学习笔记

    这几天一直在做人脸识别的项目,有用到LBP特征,但是毫无头绪,师姐这几天也比较忙,没有时间来指导我,随自己找相应的介绍LBP的博文来看,现在总算有了一个大体的思路了,就写下来吧 注:参考博文: 目标检 ...

  6. RHEL5.6配置本地yum源

    试验环境:RedHat Enterprise Linux 5.6(虚拟机) 一.挂载镜像 配置yum源第一步需要挂载镜像,或者直接复制操作系统的光盘文件至操作系统目录中. 挂载镜像命令如下: moun ...

  7. Normal equations 正规方程组

    前面我们通过Gradient Descent的方法进行了线性回归,但是梯度下降有如下特点: (1)需要预先选定Learning rate: (2)需要多次iteration: (3)需要Feature ...

  8. 454 4Sum II 四数相加 II

    给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0.为了使问题简单化,所有的 A, ...

  9. poj3735Training little cats

    链接 构造矩阵 快速幂求解 构造矩阵a[i]为每个cati所拥有的花生总数 这里多加一维用来求和,具体是怎么求得可以看下面的一组例子 假设有3个cat a[] = {1,0,0,0} 构造单位矩阵来保 ...

  10. 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法

    利用Laravel 搭建oauth2 API接口 要求 laravel 5.4以上 安装 $ composer require laravel/passport 在配置文件 config/app.ph ...