笔试算法题(18):常数时间删除节点 & 找到仅出现一次的两个数字
出题:给定链表的头指针和一个节点指针,要求在O(1)的时间复杂度下删除该节点
分析:
- 如果需要删除的节点为A,其前序节点为A-,其后续节点为A+,所以删除A之后,需要使得A-的下一个节点就是A+,常规做法是设法得到A-的索引,需要 从链表头开始遍历所以时间复杂度为O(N),但实际情况是只要保证A-的下一个节点是A+就行;
- 所以可将A+节点的内容直接复制到A节点,这时时间复杂度 为O(1),对于最后一个节点而言需要使用O(N)的时间复杂度,所以平均复杂度为(O(1)*(n-1) + O(n))/n,所以平均复杂度为O(1);
解题:
struct Node {
int v;
Node *next;
};
void deleteNode(Node *head, Node *target) {
if(target == NULL) return;
if(target->next != NULL) {
Node *temp=target->next;
target->v=temp->v;
target->next=temp->next;
delete temp;
} else {
Node *temp=head;
while(temp!=NULL) {
if(temp->next != target)
temp=temp->next;
else {
temp->next=temp->next->next;
delete target;
break;
}
}
}
}
出题:给定一个整型数组,除了两个数字只出现一次外其他数字都出现了两次,要求确定这个两个只出现一次的数字,时间复杂度为O(N),空间复杂度为O(1);
分析:
- 由于任何一个数字异或它本身的结果都为0,所以从左到右依次异或整型数组,数组中出现两次的数字的异或结果为0,则最终的结果就是出现一次的两个数字的异 或结果;由于这两个数字肯定不同,所以结果肯定非0,为了将这两个数字分别放到一个子数组中,选取结果中第一个出现的1(第k位),这样根据第k位是否为 1将数组元素分成两个子数组,他们分别包含了一个只出现一次的数字,然后针对每一个子数组重新进行异或运算,最终就可分别得到这两个仅出现一次的数字;
- 本题参考何海涛老师的解法,海涛老师威武!!非常感谢何海涛老师的无私奉献,其博客地址为:
http://zhedahht.blog.163.com/
解题:
void findInteger(int *array, int length) {
/**
* 获取整个数组的异或结果
* sum1为两个目标数字的异或结果
* */
int sum1=array[];
for(int i=;i<length;i++)
sum1^=array[i];
/**
* 找到sum1中最低位出现的1
* k表示目标位上出现的1
* */
int k=,i;
for(i=;i<sizeof(int)*;i++) {
if(sum1 & k<<i) break;
}
k<<=i;
/**
* 使用k区分不同的子数组
* 分别对子数组使用异或
* */
int int1=, int2=;
for(int i=;i<length;i++) {
if(array[i]&k)
int1^=array[i];
else
int2^=array[i];
}
int1^=;int2^=;
printf("\nthe first integer: %d",int1);
printf("\nthe second integer: %d",int2);
}
int main() {
int array[]={,,,,,-,-,};
findInteger(array,);
return ;
}
笔试算法题(18):常数时间删除节点 & 找到仅出现一次的两个数字的更多相关文章
- 算法题 18 像素翻转 牛客网 CC150
算法题 18 像素翻转 牛客网 CC150_P114 题目描述 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时 ...
- 笔试算法题(28):删除乱序链表中的重复项 & 找出已经排好序的两个数组中的相同项
出题:给定一个乱序链表,节点值为ASCII字符,但是其中有重复项,要求去除重复项并保证不改变剩余项的原有顺序: 分析:创建一个256(2^8)大小的bool数组,初始化为false,顺序读取链表,将字 ...
- 前端如何应对笔试算法题?(用node编程)
用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...
- 笔试算法题(43):布隆过滤器(Bloom Filter)
议题:布隆过滤器(Bloom Filter) 分析: BF由一个很长的二进制向量和一系列随机映射的函数组成,通过多个Hash函数将一个元素映射到一个Bit Array中的多个点,查询的时候仅当所有的映 ...
- 笔试算法题(46):简介 - 二叉堆 & 二项树 & 二项堆 & 斐波那契堆
二叉堆(Binary Heap) 二叉堆是完全二叉树(或者近似完全二叉树):其满足堆的特性:父节点的值>=(<=)任何一个子节点的键值,并且每个左子树或者右子树都是一 个二叉堆(最小堆或者 ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- 笔试算法题(47):简介 - B树 & B+树 & B*树
B树(B-Tree) 1970年由R. Bayer和E. Mccreight提出的一种适用于外查找的树,一种由BST推广到多叉查找的平衡查找树,由于磁盘的操作速度远小于存储器的读写速度,所以要求在尽量 ...
- 笔试算法题(42):线段树(区间树,Interval Tree)
议题:线段树(Interval Tree) 分析: 线段树是一种二叉搜索树,将一个大区间划分成单元区间,每个单元区间对应一个叶子节点:内部节点对应部分区间,如对于一个内部节点[a, b]而言,其左子节 ...
- 笔试算法题(41):线索二叉树(Threaded Binary Tree)
议题:线索二叉树(Threaded Binary Tree) 分析: 为除第一个节点外的每个节点添加一个指向其前驱节点的指针,为除最后一个节点外的每个节点添加一个指向其后续节点的指针,通过这些额外的指 ...
随机推荐
- HDU 5512 Pagodas (数论)
题意:给了初始的集合{a, b},然后取集合里的两个元素进行加或者减的操作,生成新的元素.问最后最多能生成多少个元素.问答案的奇偶性. 析:多先写几个你就会发现,答案就是 n / gcd(a, b). ...
- Ruby Time类和Date类
Time类 更新: 2017/06/23 更新了Data/Time在model模式下的便利方法 更新: 2018/10/12 修改了%Y相关描述防止误解 年月日时分秒,时区 生成 获取当前时 ...
- bzoj 2245 [SDOI2011]工作安排【最小费用最大流】
其实不用拆点,对于每个人我们假装他是\( s[i]+1 \)个点,可以由他向T点分别连\( s[i]+1 \)条边,容量为\( t[i][j]-t[i][j-1]\),由S点向所有产品i连容量为c[i ...
- bzoj 1610: [Usaco2008 Feb]Line连线游戏【瞎搞】
阴沟翻船.jpg 居然忘了除0的情况 枚举两两之间的线,把斜率装起来排个序去个重就好了 真是水的一晚上呢 #include<iostream> #include<cstdio> ...
- 洛谷 P3708 koishi的数学题
找规律发现\( f[i]=f[i-1]+n-\sum_{i的因数和} \) 一A了深(sh)蓝(ui)题的我被找规律绿题卡死 记得开long long #include<iostream> ...
- 我的周记5——"侵略如火,不动如山"
这周发生的事儿 最近同事晋升的参加答辩,还有的同事要转岗走了.难受... 有时候自己常常想,我是不是应该也要走了. 这儿的人好优秀呀,又舍不得离开.但是这里太安逸了,接触不到技术,靠自学呢 又感觉力不 ...
- _bzoj2818 Gcd【线性筛法 欧拉函数】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 若gcd(x, y) = 1,则gcd(x * n, y * n) = n.那么,当y ...
- _bzoj1036 [ZJOI2008]树的统计Count【树链剖分】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1036 保存模版. 执行qmax与qsum操作,往上爬的时候最开始的代码出了点小问题,往上爬的 ...
- java数组实现买彩票(通过标识符进行判断的思想)
package com.wh.shuzu; import java.util.Random; import java.util.Scanner; /** * 买彩票 * @author 王拥江同学 * ...
- C#委托的用法 在C#中我想在一个方法中调用另一个按钮的事件,怎样来实现?
最开始我也不清楚,后来我是这样想了. 1.事件和委托不是一个概念,你如果是调用control的事件,可以直接在其对应的事件eventhandler上attach自己的事件方法就好了如:this.But ...