数据结构与算法
aNotFound404
一只低调的码农。
展开
-
Vertical Histogram——字母频率柱状图(POJ2136)
问题描述读取四行字母,并输出一个垂直柱状图用以显示在输入中的所有字母的出现次数。输入:1行到4行: 大写字母 , 每行不超过72个字符输出:第一行到第?行: 由星号和空格组成的若干行,最后一行由被分开的大写字母组成。输入样例: THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG. THIS IS AN EXAMPLE TO TEST FOR YOUR HI原创 2015-05-05 22:44:17 · 2363 阅读 · 0 评论 -
[剑指offer-1351]数组中只出现一次的数字
题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小。2<=n <= 10^6。 第二行包含n个整数,表示数组元素,元素均为int。 输出: 对应每个测试案例,输出数组中只出现一次的两个数。输出的数字从小到大的顺序。 样例输入: 8 2 4 3 6 3 2 5原创 2016-02-08 23:56:51 · 314 阅读 · 0 评论 -
[剑指offer-1516]调整数组顺序使奇数位于偶数前面
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分. 输入: 每个输入文件包含一组测试案例。 对于每个测试案例,第一行输入一个n,代表该数组中数字的个数。 接下来的一行输入n个整数。代表数组中的n个数。 输出: 对应每个测试案例, 输入一行n个数字,代表调整后的数组。注意,数字和数字之间用一个空格隔开原创 2016-02-10 21:06:57 · 411 阅读 · 0 评论 -
[剑指offer-1386]旋转数组的最小数字
题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数。 输入的第二行包括n个整数,其中原创 2016-02-10 21:19:13 · 401 阅读 · 0 评论 -
[剑指offer-1515]打印1到最大的N位数
题目描述: 给定一个数字N,打印从1到最大的N位数。 输入: 每个输入文件仅包含一组测试样例。 对于每个测试案例,输入一个数字N(1<=N<=5)。 输出: 对应每个测试案例,依次打印从1到最大的N位数。 样例输入: 1 样例输出: 1 2 3 4 5 6 7 8 9#include <stdio.h>#include <stdlib.h>void print原创 2016-02-10 21:21:50 · 480 阅读 · 0 评论 -
[剑指offer-1517]链表中倒数第k个结点
题目描述:输入一个链表,输出该链表中倒数第k个结点。 (hint: 请务必使用链表。)输入:输入可能包含多个测试样例,输入以EOF结束。 对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的个数,k代表要查询倒数第几个的元素。 输入的第二行包括n个数t(1<=t<=1000000):代表链表中的元素。输出:对应每个测试案例,原创 2016-02-11 17:16:12 · 458 阅读 · 0 评论 -
[剑指offer-1518]反转链表
题目描述: 输入一个链表,反转链表后,输出链表的所有元素。 (hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束。 对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数。 输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素。 输出: 对应每个测试案例, 以此输出链表反转后的元素,如没有元素则原创 2016-02-11 19:51:38 · 332 阅读 · 0 评论 -
[剑指offer-1519]合并两个排序的链表
题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 (hint: 请务必使用链表。) 输入: 输入可能包含多个测试样例,输入以EOF结束。 对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数。 下面一行包括n个数原创 2016-02-11 20:55:20 · 400 阅读 · 0 评论 -
求最大公约数的两种算法
1.辗转相除法辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。 例如,求gcd(319,377): ∵ 377÷319=1(余58) ∴gcd(377,319)=gcd(319,58); ∵ 319÷58=5(余29), ∴ gcd(319,58)=gcd(58,29); ∵ 58÷29=2(余0), ∴ gcd(58,29)= 29; ∴ gcd(319,377)原创 2016-04-03 18:03:09 · 10759 阅读 · 0 评论 -
[剑指offer-1367]二叉搜索树的后序遍历序列
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。输入:每个测试案例包括2行: 第一行为1个整数n(1<=n<=10000),表示数组的长度。 第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]。输出:对应每个测试案例,如果输入数组是某二叉搜索树的后序遍历的结果输出Yes原创 2016-02-08 18:42:12 · 430 阅读 · 0 评论 -
排序算法001——直接插入排序
**一、基本思想** 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。插入排序非常类似于整扑克牌。在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较。无论什么时候,左手中的牌都是排好序的。如果输入数组已经是排好序的话,插入排序出现最佳情况,原创 2015-11-22 22:38:01 · 717 阅读 · 0 评论 -
二分法实战(一)——HangOver问题(POJ1003)
问题模型:问题:在一张桌子上叠放卡片,如果是一张卡片,这张卡片最多可以向桌子外伸出卡片长度的一半;如果是两张卡片,最下面的一张卡片伸出卡片长度的三分之一,上面的一张伸出卡片长度的一半,则两张卡片伸出桌子的总长度为 1/2 + 1/3 = 5/6;以此内推,N张卡片向外延伸的长度为: 1/2+1/3+1/4+…+1/(n+1),最上面的卡片向外延伸1/2.第二张向外延伸1/3,…最下面的一张向外延伸原创 2015-05-01 16:19:14 · 1089 阅读 · 0 评论 -
递归回溯法实战(一)——(Red and Black)红黑砖迷阵(POJ1979)
问题模型有一个矩形的房间里铺满正方形瓷砖。每块瓷砖涂成黑色或红色。一个人站在黑色的瓷砖上,从此出发,可以移动到四个相邻的瓷砖之一,但只能移动到黑色的瓷砖上。计算他通过重复上述移动所能经过的黑砖数。 示意图如下(画的有点丑(⊙﹏⊙)。) 输入输入包含多个数据集。一个数据集开头行包括两个正整数W和H,W和H分别表示矩阵的列数和行数,切不超过20. 每个数据集有H行,其中每行包含W个字符。每个字符的原创 2015-05-01 18:56:23 · 1881 阅读 · 0 评论 -
不用临时的变量 交换两个数的两种方法
就地交换两个数是比较经典而且基础的算法之一。 我们要交换两个数字,通常的做法就创建一个中间变量,然后进行循环赋值,比如说下面的代码: void Switch(int* p1, int* p2) { int tmp = *p1; *p1 = *p2; *p2 = tmp; }这种做法是最常见的一种交换两个数字的方法,但研究算法的人总是会提出比较诡异的问题,比如原创 2015-05-09 16:47:42 · 7696 阅读 · 0 评论 -
POJ1338——丑数
问题丑数是仅有素因子2、3和5的整数。序列1,2,3,4,5,6,8,9,10,12是前十个丑数。1被包含在丑数中。输入给出一个正整数n(n<=1500) 输入0表示结束输出对于输入的每一行,输出第n个丑数分析预先算出第1-1500个丑数存入数组中,从小到大排列,然后取出第n个输出即可。 由于丑数仅有2、3、5这三个因子,所以集合中的元素都是通过乘以2、3、5这三个因子扩展获得的。 比如: ug原创 2015-05-08 15:07:29 · 1420 阅读 · 0 评论 -
递归算法——BOX FRACTAL 盒分形(POJ2083)
问题盒分形定义如下: 1度的盒分形为: X 2度的盒分形为: X X X X X如果B(n-1)表示n-1度的盒分形,则n度的盒分形递归定义如下:B(n-1) B(n-1) B(n-1) B(n-1) B(n-1) 请画出n度的盒分形的图形输入每行给出一个不大于7的正整数。输入的最后一行以-1表示输入结束输出对于每个测试用例,出书用’X’标记的盒分原创 2015-05-07 21:24:20 · 5705 阅读 · 2 评论 -
编程面试题001——wordcount
编程面试题001——wordcount**题目背景介绍:** 这一题是我在面试某互联网企业时遇到的一道编程算法题,算是比较简单的一题,纪录下来,总结面试中遇到的点点滴滴。题目描述:有一篇文章只包含英文单词,请按它们的出现次数排序,出现最多的先输出;如果出现次数相等的,按字符串ASCII排序升序输出。**输入:** 第一行会是行数N( 0 < N <= 500)。之后N行中的每行会是一个或多个英原创 2015-10-03 17:36:21 · 1085 阅读 · 0 评论 -
编程面试题002——splitIp
题目描述粗心的小G把IPV4地址的点分隔符去掉了,每个ip地址只剩下数字,请你帮他还原出所有可能的IP字符串。**输入**输入只有一行,内容为纯数字字符串。 如:25525511135**输出**输出为多行。每行一个点分隔的IPV4字符串。多行以ASCII排序升序输出。255.255.11.135255.255.111.35**代码:**public class Main { private原创 2015-10-03 17:49:24 · 1012 阅读 · 0 评论 -
算法初探001——单链表反转
单链表的反转问题是一道很基本的问题。题目如下: 有一个单链表 1 ->2->3->4->5->6 反转后链表为:6->5->4->3->2->1.方法一解析:可以使用三个指针pre ,temp,next对逐个节点进行反转。详细流程如下: (4) 初始状态pre = head;tmp = head->next;pre->next = null;(2)第一次循环:next = tmp->next原创 2015-10-17 00:13:55 · 1453 阅读 · 1 评论 -
求数组最大子序列的和
题目:给出数组{4,-3,5,-2,-1,2,6,-2},求子序列的最大和。分别用一下两种方法解决。#include <stdio.h>// 方法1: 分治法//时间复杂度 O(NlogN)int max3(int num1 , int num2 , int num3){ int max = num1; if(max<num2)max= num2; if(max<nu原创 2016-04-03 18:55:21 · 2900 阅读 · 1 评论