出题:给定一个乱序链表,节点值为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. Vijos P1782 借教室 ( 前缀和&&差分序列)

    题目链接:借教室 题意:给出n天得教室数目,m个借教室得单子,按顺序借教室,问哪个单子不满足并输出 分析:可以用线段树做,会T,常数比较大,选择用差分序列维护前缀和,二分答案即可 #include&l ...

  2. React 事件 传参

    绑定事件用 bind方法,第一个参数是 this,第二个参数是需要传入的值如下: <a onClick={this.updateLabel.bind(this,'参数1','参数2')} > ...

  3. YCOJ中国邮递员问题

    题目: Description 一个邮递员从邮局出发,需要去 n - 2个城市送信,送完信件以后回家. 邮局在城市 1,家在城市 n,任意两个城市之间都有道路,但是这些道路是单向,也就是说 a 到 b ...

  4. C# DateTime.Now 详解

    //2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString(& ...

  5. ______________从时间超限到800ms 到200ms——————2098

    分拆素数和 Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted S ...

  6. 转】[1.0.2] 详解基于maven管理-scala开发的spark项目开发环境的搭建与测试

    场景 好的,假设项目数据调研与需求分析已接近尾声,马上进入Coding阶段了,辣么在Coding之前需要干马呢?是的,“统一开发工具.开发环境的搭建与本地测试.测试环境的搭建与测试” - 本文详细记录 ...

  7. 手机APP测试点总结(参考)

    参考链接:http://www.zengyuetian.com/?p=2305 手机APP测试点: 功能测试:多注意核心业务风险(如:注册.登录.付费.订单等) 兼容性测试:系统兼容性.硬件兼容性.软 ...

  8. jenkins一次构建两次触发job问题

    具体内容详见: https://issues.jenkins-ci.org/browse/JENKINS-21464?focusedCommentId=250183&page=com.atla ...

  9. 移动游戏By HYJ

    暴力求SG函数即可,记忆化贼方便 /*program from Wolfycz*/ #include<cmath> #include<cstdio> #include<c ...

  10. CodeFoces Round #443(div.2)

    http://codeforces.com/contest/879/ A. Borya's Diagnosis time limit per test 2 seconds memory limit p ...