笔试算法题(10):深度优先,广度优先以及层序遍历 & 第一个仅出现一次的字符
出题:要求实现层序遍历二元搜索树,并对比BFS与DFS的区别
分析:层序遍历也就是由上至下,从左到右的遍历每一层的节点,类似于BFS的策略,使用Queue可以实现,BFS不能用递归实现(由于每一层都需要存储所有节点,所以非常耗用内存)。这段代码主要用于反映BFS与DFS的联系;
解题:
class Node {
public:
int value;
Node *left;
Node *right;
};
class MyStack {
private:
Node *array[];
int capability;
int top;
public:
MyStack(int cap=): array((Node**)malloc(sizeof(Node*)*cap)), capability(cap), top() {}
~MyStack() {
for(int i=;i<top;i++)
delete array[i];
delete [] array;
}
bool isFull() {
return top == capability;
}
bool isEmpty() {
return top == ;
}
int freeSlot() {
return capability - top;
}
/**
* top当前的位置就是下一个push元素所在的slot
* */
bool push(Node *n) {
if(isFull()) return false;
array[top++]=n;
return true;
}
Node* pop() {
if(isEmpty()) return false;
return array[--top];
}
void ShowStack() {
int temp=top-;
printf("\n");
for(int i=;i<=temp;i++)
printf("%d, ",array[i]->value);
printf("\n");
}
};
class MyQueue {
private:
Node *array[];
int capability;
int length;
int head;
int tail;
public:
MyQueue(int n=): array((Node**)malloc(sizeof(Node*)*n)), head(),tail(),capability(n), length() {}
~MyQueue() {delete [] array;}
bool isFull() {
if(length == capability) return true;
return false;
}
bool isEmpty() {
if(length == ) return true;
return false;
}
int freeSlot() {
return capability-length;
}
void setBack() {
length=;
}
/**
* head当前的指向位置是下一次将push的元素的
* */
bool push(Node *n) {
if(isFull()) return false;
array[head]=n;
head=(head+)%(capability);
length++;
return true;
}
/**
* tail当前指向的位置是下一次将pop的元素的
* */
Node* pop() {
if(isEmpty()) return false;
int temp=tail;
tail=(tail+)%(capability);
length--;
return array[tail];
}
void showQueue() {
int i=tail;
int temp=length;
printf("\ncurrent stack elements: \n");
while(temp>) {
printf("%d, ",array[i++]->value);
temp--;
}
}
};
/**
* 只要把MyQueue *queue=new MyQueue()换成
* MyStack *stack=new MyStack()
* 其他代码不变,就是dfs
* */
void bfs(Node *root) {
MyQueue *queue=new MyQueue();
Node *current;
printf("%d, ", root->value);
while(!queue->isEmpty()) {
current=queue->pop();
if(current->left != NULL) {
printf("%d, ", current->left->value);
queue->push(current->left);
}
if(current->right != NULL) {
printf("%d, ", current->right->value);
queue->push(current->right);
}
}
delete queue;
}
出题:在一个字符串中找到第一个仅出现过一次的字符;
分析:
- 解法1:创建辅助链表顺序存储仅出现过一次字符;每当从字符串中扫描一个新字符都遍历辅助链表,如果有相同值则删除对应的链表节点,如果没有相同值则存储 在链表尾,直到扫描完所有字符;最终辅助链表头节点就是第一次仅出现过一次的字符;时间复杂度分析:最坏情况当所有字符都仅出现一次,O(n2),最好情 况O(n);
- 解法2:一般涉及到大范围分布的有限字符,并且需要记录字符出现次数或者其他累加值的时候,哈希表(Hash Table)往往是第一选择;表宽度是所有可能出现的字符个数,256个,这样位置信息也就是字符编码;每一个slot记录的信息是对应位置的字符是否出 现超过1次,如果有严格的空间要求可以使用2bit的BitMap,简单起见可以直接使用int类型。当第一遍扫描字符串之后,字符信息就已经映射到 Hash Table中,第二遍再次扫描字符串,并在Hash Table中查找对应的出现次数,一旦遇到仅出现一次的字符,扫描结束,如果没有则扫描失败。如果不计Hash Function的时间,时间复杂度为O(n),Hash Function正好是解法1中顺序遍历放的优化,对于复杂的Hash Function,其时间复杂度有关键性影响;
解题:
char FindFirstChar(const char *target) {
const char *current=target;
int hashTable[];
/**
* 需要将Hash Table初始化,可以使用memset所有内存储都设置为0;
* 对于256大小的Table,其不能处理宽字符的情况
* */
//memset(hashTable, 0, sizeof(int)*256);
for(int i=;i<;i++) {
hashTable[i]=;
}
/**
* 这里可能出现的问题是当字符重复次数过多,int可能溢出,所以优化版本
* 使用2代表所有出现超过一次的情况
* */
while(*current != '\0') {
if(hashTable[*current] == ) {
current++;
} else {
hashTable[*current]++;
current++;
}
}
current=target;
while(*current != '\0') {
if(hashTable[*current] == ) {
return *current;
}
current++;
}
/**
* 当从这里返回则说明所有字符都出现超过一次,所以返回-1,表示
* 没有任何可行字符,所以调用函数需要使用int类型,然后判断是否
* 为-1,如果不是才转换为char类型
* */
return -;
}
int main() {
const char *target="";
int temp=(int)FindFirstChar(target);
if(temp!=-) {
printf("\nthe first char is : %c\n",(char)temp);
} else
printf("\nall chars are repeated more than once\n");
return ;
}
笔试算法题(10):深度优先,广度优先以及层序遍历 & 第一个仅出现一次的字符的更多相关文章
- 笔试算法题(37):二叉树的层序遍历 & 最长递增的数字串
出题:要求层序遍历二叉树,从上到下的层次,每一层访问顺序为从左到右,并将节点一次编号,输出如下:如果只要求打印指定的level的节点,应该如何实现. a b c d e f g h i 分 ...
- 前端如何应对笔试算法题?(用node编程)
用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...
- 笔试算法题(50):简介 - 广度优先 & 深度优先 & 最小生成树算法
广度优先搜索&深度优先搜索(Breadth First Search & Depth First Search) BFS优缺点: 同一层的所有节点都会加入队列,所以耗用大量空间: 仅能 ...
- php笔试算法题:顺时针打印矩阵坐标-蛇形算法
这几天参加面试,本来笔试比较简单,但是在面试的时候,技术面试官说让我现场写一个算法,顺时针打印矩阵的坐标,如图所示 顺序为,0,1,2,3,4,9,14,19,24,23,22,21,20,15,10 ...
- 小小c#算法题 - 10 - 求树的深度
树型结构是一类重要的非线性数据结构,树是以分支关系定义的层次结构,是n(n>=0)个结点的有限集.关于树的基本概念不再作过多陈述,相信大家都有了解,如有遗忘,可翻书或去其他网页浏览以温习. 树中 ...
- 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)
议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...
- 笔试算法题(52):简介 - KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm)
议题:KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm) 分析: KMP算法用于在一个主串中找出特定的字符或者模式串.现在假设主串为长度n的数组T ...
- 笔试算法题(06):最大连续子数组和 & 二叉树路径和值
出题:预先输入一个整型数组,数组中有正数也有负数:数组中连续一个或者多个整数组成一个子数组,每个子数组有一个和:求所有子数组中和的最大值,要求时间复杂度O(n): 分析: 时间复杂度为线性表明只允许一 ...
- 笔试算法题及解答(Python)
1.给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数 # coding:utf-8 ''' Created on 2 ...
随机推荐
- 在Centos中yum安装和卸载软件的使用方法(转载)
转自: http://gzmaster.blog.51cto.com/299556/72278 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...
- bzoj 4318: OSU!【期望dp】
思路有点眼熟啊,就是设l1记录长为x的极长全1串贡献x的答案,l2记录长为x的极长全1串贡献x^2的答案,f记录真正的答案 转移的话根据n-(n-1)=1,n^2-(n-1)^2=2n-1,n^3-( ...
- vsftpd 配置文件
# mple config file /etc/vsftpd/vsftpd.conf # # The default compiled in settings are fairly paranoid. ...
- _bzoj1002 [FJOI2007]轮状病毒【瞎搞】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1002 这种题真是有毒,很多叼一点的都用matrix tree定理推出了递推公式,也有一些用好 ...
- Base64编码与解码 分类: 中文信息处理 2014-11-03 21:58 505人阅读 评论(0) 收藏
Base64是一种将二进制转为可打印字符的编码方法,主要用于邮件传输.Base64将64个字符(A-Z,a-z,0-9,+,/)作为基本字符集,把所有符号转换为这个字符集中的字符. 编码: 编码每次将 ...
- 【Visual Studio Code 】使用Visual Studio Code + Node.js搭建TypeScript开发环境
1.准备工作 Node.js Node.js - Official Site Visual Studio Code Visual Studio Code - Official Site 安装Node. ...
- html 测试
斯蒂芬斯蒂芬 20:23你过来吧,我们好好谈一谈 好好学习 21:22这是一个无法避免的错误 作为一个新手,我在学习HTML文件的格式,我觉得博客园的编辑器很棒, 查看这些源代码让我学习到了许多知识. ...
- Objective-c单例模式的正确写法--用dispatch 线程安全
单例模式在iOS开发中可能算是最常用的模式之一了,但是由于oc本身的语言特性,想要写一个正确的单例模式相对来说比较麻烦,这里我就抛砖引玉来聊一聊iOS中单例模式的设计思路.关于单例模式更多的介绍请参考 ...
- tomcat 修改端口
修改tomcat端口号: a) 去tomcat安装目录(或者解压目录)下的“conf”文件夹中找到文件“server.xml”(本例:“D:\Program Files\Apache Software ...
- POI导出时,将指定的列设置为下拉列表
本示例设置第2列为下拉框(下拉框内容为:是/否),从第5行开始到5657行结束. 关键代码示例: ComboxList = new String[]{"是","否&quo ...