![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
liangsc94
渴望变得出色,强大
展开
-
二哥学算法之链表逆转
上一篇我们介绍了单向链表,现在我们说一下链表逆转。所谓链表逆转就是把链表就改变链表中节点的方向,第一个数据变成最后一个数据;最后一个数据变成第一个数据。思路也很简单,就是需改变每个节点两个方向的指针。下面画一下逻辑图:上图是没有被逆转的单链表而逆转后的链表则如上图。很明显,原来的链表尾Last现在变成了链表头,原来的链表头现在需要变成链表尾。关键部分就是(举个例子)原创 2014-12-01 09:34:26 · 1012 阅读 · 0 评论 -
计数排序和桶排序
介绍两种非基于比较的排序算法。前面提到的排序算法,快排,堆排,合并等都是通过比较元素之间的大小来进行排序的,基于比较的排序是不能突破NLog2NNLog_2N的下界的。而这两种算法的时间复杂度是可以达到O(N)O(N)的,当然它收到一定条件的限制。 计数排序: 计数排序假设输入数据的范围已经知道,并且是在一个确定的范围内,如(0,K](0,K]内。基本思路是:对于每一个输入数据X,确定小于X的原创 2015-04-12 22:51:12 · 1064 阅读 · 0 评论 -
马的遍历问题
问题很常见喽,也成为骑士巡逻问题。中国象棋中“马走日“,现在有一匹马和一个8X8的棋盘,在棋盘中任意位置。试着求解出一种方案,让这匹马遍历棋盘中的每一个节点,每个节点只能访问一次。 很明显是一个回溯的题目,不过最关键的部分就是优化了。我一开始用了穷举的方式。不过计算量实在太大了,计算机跑了一上午都没有算出来。后来查资料才知道有一种优化的方法,也称为Warnsdorff规则,具体就是:Warnsdo原创 2015-04-20 21:29:33 · 5077 阅读 · 3 评论 -
八皇后问题
#include <iostream>#define N 8using namespace std;int arr[N+1]={0,0,0,0,0,0,0,0};bool canPlace(int k){ for(int i=1;i<k;++i) if(abs(arr[i]-arr[k])==k-i || arr[i]==arr[k]) ret原创 2015-07-02 09:40:36 · 612 阅读 · 0 评论 -
就一个简单的大数计算
也只是刚刚写出了加法,用的是1 000 000 000进制,不过发现对于加法还不如用最基本的方法方便。用1 000 000 000进制的方便也就在于处理乘法和除法了。计算机做乘除运算还是比较耗时的。#include <random>#include <iostream>#include <fstream>#include <string>#include <vector>#include原创 2015-08-30 18:27:21 · 6065 阅读 · 0 评论 -
随手写了一个鸡肋的二叉树
好长时间没碰这东西了,今天复习了一下。发现编程功力还是有点提升的,撸出来也没有花多少功夫,不过貌似有点鸡肋。。。。哈哈#include <stdio.h>#include <stdlib.h>struct BinaryTree{ struct BinaryTree *left; struct BinaryTree *right; int data; int cou原创 2015-09-12 20:56:10 · 5598 阅读 · 1 评论 -
反转二叉树,哈哈
这个问题因为前段时间一个大牛工程师Max Howell面试谷歌都火了,后来这家伙去了苹果。。我也不知道说什么了,谷姑娘把人家活生生的给拒了。 我今天也试着写了一下,递归版本的很easy的就写了出来。非递归版本的,自己思路一开始就错了。后来看了一篇博客,不过如此。/***** reverser binary tree *********** author: mark liang ****原创 2015-10-09 14:25:57 · 1848 阅读 · 0 评论 -
反转链表
今天翻了云风大大的微博,看到他说他给应届生出了一道笔试的编程题,结果7 8 个人没有一个能正确地写出来。于是我就试着写了下,不过发现逻辑很简单呀。 //保存后继节点//更改当前结点的next(指向前一个)//设当前结点为前驱节点//设后继节点为当前结点//loop#include #include struct Node;struct Node{ int data; s原创 2016-03-05 18:14:33 · 429 阅读 · 0 评论 -
一次失败的面试
前几天,承蒙一位大龄哥哥看得起。让我去他所在的一家公司面试,去之前自己就已经定下目标了,坚持和面试官交谈10分钟就算胜利。没想到最后竟然坚持了2个半小时,然而这并没有什么卵用。题目并不难,现在看来,我紧张是我这次失利的一部分原因之外,自己在纸上写代码的能力不足也是一个方面。题目只有三道,有一个是非递归遍历遍历二叉树。这个的确是我写不出来,如果你不提示我用栈或者队列实现的话。剩余的2道都是一个正常的程原创 2016-04-19 18:39:33 · 583 阅读 · 0 评论 -
Prim算法(最小生成树)
问题引入: 假设我们要设计一个电子电路,我们常常需要将多个组件的针脚连接在一起。要连接n个针脚,可以用n-1根连线,每跟连线,连接两个针脚。很显然,我们希望所用连线的长度最短。 可以把上述的连线问题用一个连通的无向图来表示G=(V,E)G=(V,E),V是针脚即点的集合,E是针脚之间可能的连接(边的集合),并且对于每条边(u,v)∈E(u,v)\in E,我们赋予它权重w(u,v)w(u,v)作原创 2015-04-02 16:12:03 · 683 阅读 · 1 评论 -
Programming Perals 变位词实现
网上讲这个问题的blog一大堆,不过我还是按着自己的思路把整个程序实现了一下,还有貌似我的实现方法和大部分讲这个的不一样。 问题引入: 给定一本英语单词词典,找出其中所有的变位词集。例如:因为”pots”,”stop”,”opts”相互之间都是由另一个词的各个字母改变序列实现的,所以这些词之间就是变位词。 常规的解题思路谁都想得出来,不过只要写这样我想肯定就会死的,原因很简单,效率太低。《编程原创 2015-04-03 18:38:46 · 499 阅读 · 0 评论 -
二哥学算法之单向链表
开始之前先扯下淡。我也是正在学数据结构和编程,所以码的代码肯定不好,说不定还会有错误。若有错误,欢迎指出。若你是和我一样的菜鸟,咱们共同进步,若你是大神;欢迎提点。PS:二哥是我的外号第一篇是介绍单向链表:这个应该是数据结构中最入门级的。所谓链表就是物理结构上存储不连续但逻辑结构上确实依次相连的线性结构。因为内存一般是动态随机分配的,所以逻辑上几乎不可能是连续的。链表的实现也很简单,没一个节点中含原创 2014-11-29 20:19:28 · 1007 阅读 · 0 评论 -
二哥学算法之图(开篇)
在这里先给大家定义一下图:一个图(Graph)可以看做是边和点的集合。我们有G=(V,E) V(vertex)表示顶点集,E(Edge)表示边集。每一条边就是一个点对(u,v),如果一个点对是有序的,比如说只能从u到v,则(u,v)这条边就是有序的。反之,则有无向图。即(u,v),(v,u)都是合法的。有时图还会具有第三种属性,叫做权(weight)或值(cost)。 现在给大家介绍两种图的表示原创 2015-03-17 18:29:57 · 681 阅读 · 0 评论 -
二哥学算法之快速排序和堆排序
快速排序:快速排序是目前在实践中已知的最快的排序算法。它的平均时间复杂度为ON(log2N)ON(log_2N),不过它也是不稳定的,最坏时间复杂度为O(N2)O(N^2),但是这种情况是不常出现的,也是可以避免的。 该算法之所以快的原因,是因为它有一个非常优化和高度精炼的内部循环。它也用到了分治的思想。一般步骤如下: 1:选择序列S中的某一元素作为枢纽元(pivot)A,然后剩余元素分别与A做原创 2015-03-19 16:43:04 · 713 阅读 · 0 评论 -
爬楼梯问题
OK,前段时间在一篇blog上看到一个关于楼梯的面试题,大概内容如下:现有一个人,规定他上楼梯时只能一步走一个台阶或者两个台阶。要求:给定任意楼梯的阶数,求共有多少种方法爬完楼梯。如果有经验可以看出,这是一道递归的题目。不过这个递归 程序怎么写呢?我的思路是可以这样想,不管他前面 怎么爬,最后总是要从N-2阶或者N-1阶 上来。当从N-2阶上来时,就有两种方法:1 1和 2(即一次一步和一原创 2015-03-11 17:36:06 · 772 阅读 · 0 评论 -
二哥学算法之归并排序和希尔排序
归并排序是“分治”法一个很典型的应用。它比较稳定,时间复杂度也比较好,最坏也只是ON(log2N)ON(log_2N),空间复杂度为O(N)O(N)。 它的基本思想是对两个已经排好序的表(设为A和B)进行合并。因为A,B都是已经排好序的。所以将输出放到第三个表(设为C)时,一趟排序就可以完成。 核心思想就是递归,如果输入序列只有1个元素,答案很显然。否则,就对序列中的前半部分数据和后半部分数据各原创 2015-03-22 09:34:08 · 1826 阅读 · 0 评论 -
一道简单的面试题
昨天晚上参加了一个模拟考试,做到简答题时被其中的一个编程题卡住了。最后也没有写出来,不过一觉醒来之后,发现其实也并不难。 题个大概意思如下:DNA序列由A C G T四个元素构成,如ACGCGTA。所谓逆序是指类似上面:GC GA CA这样的片段。一段DNA序列的逆序度是指序列中逆序的个数。 题目要求:现给定一DNA序列,求出该序列的逆序度,要求时间复杂度为O(N)O(N),N为序列长度。 分原创 2015-03-22 12:11:29 · 583 阅读 · 0 评论 -
BFS
BFS(广度优先搜索)是图的一个基本的也很简单的搜索算法,也是很多图的基本算法的原型。后面提到的最小生成树prim算法和Dijkstra的单源最短路径都是用了类似广度优先搜索的思想。 广度优先搜索的基本思想是给定一个图G=(V,E)G=(V,E)和一个可以识别的源节点 S,BFS对图G中的边进行系统性的探测搜索来发现所有可以从源节点S到达的所有节点。具体的描述是: while Q≠∅Q \ne\原创 2015-03-30 18:30:07 · 390 阅读 · 0 评论 -
二哥学算法之排序
这次为大家介绍几个通过交换元素位置排序的程序,言外之意肯定也有不通过交换元素位置排序的程序。 从最简单最基本的冒泡排序开始: 冒泡排序:这里引用一下wiki上面的解释:它通过重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把交换他们的位置,走访数列的工作是重复地进行直到没有再需要交换,这时也就标志着数列已经排序完成!算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。原创 2015-03-14 11:44:35 · 479 阅读 · 0 评论 -
leetcode009
class Solution {public: bool isPalindrome(int x) { if( x<0 ) return false; int div=1; int low= 0, high = 0; int y=x; while( x/div >= 10 )原创 2016-08-27 17:28:06 · 542 阅读 · 0 评论