出题:要求实现层序遍历二元搜索树,并对比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):深度优先,广度优先以及层序遍历 & 第一个仅出现一次的字符的更多相关文章

  1. 笔试算法题(37):二叉树的层序遍历 & 最长递增的数字串

    出题:要求层序遍历二叉树,从上到下的层次,每一层访问顺序为从左到右,并将节点一次编号,输出如下:如果只要求打印指定的level的节点,应该如何实现. a b  c d  e  f  g h  i  分 ...

  2. 前端如何应对笔试算法题?(用node编程)

    用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...

  3. 笔试算法题(50):简介 - 广度优先 & 深度优先 & 最小生成树算法

    广度优先搜索&深度优先搜索(Breadth First Search & Depth First Search) BFS优缺点: 同一层的所有节点都会加入队列,所以耗用大量空间: 仅能 ...

  4. php笔试算法题:顺时针打印矩阵坐标-蛇形算法

    这几天参加面试,本来笔试比较简单,但是在面试的时候,技术面试官说让我现场写一个算法,顺时针打印矩阵的坐标,如图所示 顺序为,0,1,2,3,4,9,14,19,24,23,22,21,20,15,10 ...

  5. 小小c#算法题 - 10 - 求树的深度

    树型结构是一类重要的非线性数据结构,树是以分支关系定义的层次结构,是n(n>=0)个结点的有限集.关于树的基本概念不再作过多陈述,相信大家都有了解,如有遗忘,可翻书或去其他网页浏览以温习. 树中 ...

  6. 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)

    议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...

  7. 笔试算法题(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 ...

  8. 笔试算法题(06):最大连续子数组和 & 二叉树路径和值

    出题:预先输入一个整型数组,数组中有正数也有负数:数组中连续一个或者多个整数组成一个子数组,每个子数组有一个和:求所有子数组中和的最大值,要求时间复杂度O(n): 分析: 时间复杂度为线性表明只允许一 ...

  9. 笔试算法题及解答(Python)

    1.给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数 # coding:utf-8 ''' Created on 2 ...

随机推荐

  1. Python科学计算工具包

    import numpy as np # 创建一个Ndarray # 1. 从list对象中创建 # 2. 创建一个特定的数组,全1数组ones,随机数组random.randn,对角矩阵diag # ...

  2. 【黑金教程笔记之004】【建模篇】【Lab 03 消抖模块之一】—笔记

    设计思路: (1)       一旦检测到按键资源按下(从高电平到低电平),“电平检测模块”就会拉高H2L_Sig电平,然后拉低. (2)       “10ms延迟模块”检测到H2L_Sig高电平, ...

  3. Python机器学习算法 — 关联规则(Apriori、FP-growth)

    关联规则 -- 简介 关联规则挖掘是一种基于规则的机器学习算法,该算法可以在大数据库中发现感兴趣的关系.它的目的是利用一些度量指标来分辨数据库中存在的强规则.也即是说关联规则挖掘是用于知识发现,而非预 ...

  4. Ubuntu 18 安装 wps

    本来有三种方法 1. 软件中心 安装最简单 2. 命令行snap 安装 如果没有安装snap 先安装 sudo apt install snapd 然后安装wps sudo snap install ...

  5. UOJ228 简单数据结构练习题

    Description 传送门 维护一个数列, 有以下操作: 对[l,r]同时加上x 把[l,r]开根后下取整. 查询[l,r]之和 n,m \(\leq\)$ 100000, $\(a_i,x \l ...

  6. [POI2007]大都市meg

    Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n ...

  7. django中实现websocket

    一.Websockets介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信 ...

  8. DB buffer bussy wait 分析一例

    ####sample 1: DB层分析OI DB层分析OI的信息如下: 1. 异常时间段,  Logical reads:/ Physical reads/ Physical write  指标都低于 ...

  9. mysql 中 时间函数 now() current_timestamp() 和 sysdate() 比较

    转载请注明出处 https://www.cnblogs.com/majianming/p/9647786.html 在mysql中有三个时间函数用来获取当前的时间,分别是now().current_t ...

  10. 外文翻译 《How we decide》赛场上的四分卫

    本书导言翻译 为了能看懂这一章,先做了如下的功课: 百度百科 四分卫 国家橄榄球联盟中文站 在2002年超级碗赛场上,比赛的时间仅剩80秒,两队比分持平.新英格兰爱国者队于17码的位置执球,他们的对手 ...