
Algorithm
小_鱼
这个作者很懒,什么都没留下…
展开
-
输出指定图形
输出如下图形:2013年4月27号第二题:#include #define MAX_COL 2*100 - 1 //max column#define MAX_ROW MAX_COL/*** @brief output ** @Param: N*/void output(int N){ int a[MAX_COL][M原创 2013-06-19 22:03:06 · 611 阅读 · 0 评论 -
求两个串中的第一个最长子串
题目:求两个串中的第一个最长子串(神州数码以前试题)。如"abractyeyt","dgdsaeactyey"的最大子串为"actyey"。#include #include using namespace std;//两个串中的第一个最长子串string FindLongestCommonSubString(string strOne, strin转载 2013-09-20 15:05:13 · 782 阅读 · 0 评论 -
子数组的最大乘积
题目:给定一个长度为N的整数数组,只允许用乘法,不能用乘法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。#include "stdafx.h"#include using namespace std;#define INFINITY_MAX 32767#define INFINITY_MIN -32767void PrintSubArr转载 2013-09-20 15:16:46 · 611 阅读 · 0 评论 -
大数相乘
题目:请使用代码计算1234567891011121314151617181920*2019181716151413121110987654321。答:#include "stdafx.h"#include #include string>using namespace std;int _tmain(int argc, _TCHAR* argv[]){转载 2013-09-20 16:20:49 · 559 阅读 · 0 评论 -
找出一个数组中超过一半相同的数
给定一个数组a,其中超过一半的数为一个定值(相同),在不进行排序。不开设额外数组的情况下,以最高的效率写出这个算法,并返回这个数 、解法: 依次用数组中每个元素与其他元素 异或, 记录为0的个数(为0表示2数相等)若为0的个数大于数组长度的一半,这个数就是要找的数。原创 2013-09-20 23:14:34 · 1687 阅读 · 0 评论 -
数组元素的值为其他所有元素的累积
题目:一个长度为n的数组a[0],a[1],...,a[n-1]。现在更新数组的各个元素,即a[0]变为a[1]到a[n-1]的积,a[1]变为a[0]和a[2]到a[n-1]的积,...,a[n-1]为a[0]到a[n-2]的积(就是除掉当前元素,其他所有元素的积)。要求:具有线性复杂度,且不能使用除法运算符。#include "stdafx.h"#include转载 2013-09-20 14:33:10 · 827 阅读 · 0 评论 -
整数数组0元素后移
题目:如下:int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)。思路:计算0元素个数count,将非零元素向前移动,最后数组末尾填充count个0转载 2013-09-20 15:35:16 · 792 阅读 · 0 评论 -
字符串数字从小到大输出
题目:将一个随机的整数转换成一个按各位上数值大小排序的整数,例如整数2541转换成1245,随机整数521368转换成123568,要求不能使用一步到位的库函数.答:哈希表排序#include "stdafx.h"#include using namespace std;//字符串数字从小到大输出void Solution(char *str){ if (转载 2013-09-20 15:44:23 · 855 阅读 · 0 评论 -
完全二叉树指向同一层的相邻结点
题目:对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。答:时间复杂度为O(n),空间复杂度为O(1)。#include "stdafx.h"#include #include #include using namespace转载 2013-09-20 23:36:56 · 683 阅读 · 0 评论 -
找出一个有序数组中任意2数之和等于给出的第三个数
人人网: 给出一个有序数组,另外给出第三个数,问是否能在数组中找到两个数,这两个数之和等于第三个数,左右共同开始,使用“碰撞”的方式进行匹配,只需遍历一次数组即可算出结果。我们首先看到第一句话,这个数组是有序的,所以,我们可以定义两个指针,一个指向数组的第一个元素,另一个指向应该指向的位置(这个需要看具体的实现和数组给定的值),首先计算两个位置的和是否等于给定转载 2013-09-20 23:52:16 · 1709 阅读 · 0 评论 -
只允许遍历一遍字符串,找出字符串中第一个只出现一次的字符
find the first unique character in a string and you can just traverse this string only one time. if there is no such character, just return '#' and '#' will not appear in the string, else return the转载 2013-09-25 23:13:08 · 674 阅读 · 0 评论 -
STL系列十一 随机三趣题——随机重排,文件中随机取一行,生成N个随机数。
本文将介绍三个有趣的随机问题,分别是随机重新排列、从文件中随机取一行数据、生成N个随机数。 一.随机重新排列将一个序列打乱并对其进行随机的重新排列,关键在于每种序列的被选择概率要一样,不然有失“公平”。现在让我们来寻找如何保证每种序列被选择的概率一样大的算法。首先假设这个数组只有二个元素,设数组a为{1, 2},显然这个数组只有二种可能的排列,要么是{1,2}要么是转载 2013-10-12 22:34:35 · 737 阅读 · 0 评论 -
求一个正整数N的开方,要求不能用库函数sqrt(),结果的精度在0.001
#include using namespace std; int main() { int N; cout"输入N的值:"; cin>>N double x1 = 1;//初值 double x2 = x1/2.0+N/2.0; while( fabs(x2-x1)>0.001)转载 2013-09-27 17:03:19 · 1068 阅读 · 0 评论 -
如何从10亿查询词找出出现频率最高的10个? (Top K问题)
1. 问题描述在大规模数据处理中,常遇到的一类问题是,在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这类问题通常称为“top K”问题,如:在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载率最高的前10首歌等等。2. 当前解决方案针对top k类问题,通常比较好的方案是【分治+trie树/hash+小顶堆】,即先将数据集按照has转载 2013-10-19 21:20:00 · 1790 阅读 · 0 评论 -
将一个字符串逆序输出
首先我们用一个小程序1+2+3+4+5=15这个小程序用递归的方法求出来: /* 目的:为了清楚的分析递归方法在执行中的顺序,应用到具体的程序当中*/#include int s(int n);int main(void){ int n = 5; printf("结果是:%d\n",s(n)); retur原创 2014-06-23 22:52:45 · 2744 阅读 · 0 评论 -
找出两个字符串中最大公共子字符串,如"abccade"、"dgcadde"的最大子串为"cad"
//// 此题用for能控制循环int GetCommon(char *s1, char *s2, char **r1, char **r2) { int len1 = strlen(s1); int len2 = strlen(s2); int maxlen = 0; for(int i = 0; i { for(int j = 0; j转载 2014-06-23 22:49:54 · 956 阅读 · 0 评论 -
A*算法原理
广度优先搜索和深度优先搜索都属于盲目型搜索算法,在选择下一个搜索节点的时候没有一个准则,去选择最优的。很多情况下需要会穷举整个空间,因此只适用于规模较小的搜索。因此需要用到另外一种算法---启发式搜索。一、A*算法原理启发式搜索就是在状态空间中对每一个搜索位置进行评估,得到最好的位置,再从这个位置进行搜素直到目标。这样可以省略大量无谓的搜索路径。转载 2014-06-10 22:00:24 · 9430 阅读 · 0 评论 -
马的走法问题
一个4×5的棋盘,输入马的起始坐标,求马能返回初始位置的所有不同走法的总数(马走过的位置不能重复,马走“日”字)。 思想:递归、有时用数组列出全部元素也是个方法、全局变量初始化为0#include using namespace std;const int ROWS = 4;//行数const int COLUMS = 5;//列数转载 2014-06-10 22:26:32 · 712 阅读 · 0 评论 -
数组中大于等于左侧所有数,小于等于右侧所有数的数
题目:在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。答:#include "stdafx.h"#include using namespace std;//数组中大于等于左侧所有数,小于等于右侧所有数的数void FindSpecialNumber(int *arr, int length){ if (NULL == arr转载 2013-09-20 13:40:28 · 1138 阅读 · 0 评论 -
给定一个8*8的方格子,A点到B点的最短路径有多少条?
题目:给定一个8*8的方格子,如下图所示,求A点到B点的最短路径有多少条?用算法实现。(回溯法)广度优先搜索只能找出一条最短路径 答:从图中可以看出,A点到B点的最短路径为16,即A点横走8小格,纵走8小格才能最快到达B点,这是排列组合的问题,即从最短路径16中选取8个横走的小格子(或者从最短路径16中选取8个纵走的小格子)。所以从A点到B点的最短路径条数,直接转载 2013-09-20 01:19:38 · 21251 阅读 · 1 评论 -
计算机科学中最重要的32个算法
奥地利符号计算研究所(Research Institute for Symbolic Computation,简称RISC)的Christoph Koutschan博士在自己的页面上发布了一篇文章,提到他做了一个调查,参与者大多数是计算机科学家,他请这些科学家投票选出最重要的算法,以下是这次调查的结果,按照英文名称字母顺序排序。A* 搜索算法——图形搜索算法,从给定起点到给定终点计算出原创 2013-06-19 23:45:52 · 426 阅读 · 0 评论 -
单链表翻转
再次强调:单链表不能出现:p=head;p++; (没有p++ 应为p = p->next)单链表大概有这几种: reverse1.新建一个单链表把原链表的内容逐个头插法插入新链表中.从而实现了链表的翻转. reverse2.新建一个数组把原链表的内容copy到数组和新链表中.从而实现了链表的翻转. reverse3.一次遍历单链表,原地将原创 2013-06-20 23:54:25 · 763 阅读 · 0 评论 -
生成a到b之间的随机数
现在有一个函数rand(0,1)可以随机生成0或者1,即生成0的概率是1/2,生成1的概率也是1/2.现在要求用这个函数实现函数rand(a,b):生成a和b之间的随机数(包含a和b),并分析时间复杂度~ 取值c = b-a作为一个整数,找到不小于数c的第一个2的n次方(例如,如果c为5,就是2的3次方是8;c为63就是2的6次方64) 之后利用rand(0,1),分别每次原创 2013-06-23 16:39:46 · 8717 阅读 · 0 评论 -
从(0,1)中平均随机出几次才能使得和超过1?(e)
为了证明这一点,让我们先来看一个更简单的问题:任取两个 0 到 1 之间的实数,它们的和小于 1 的概率有多大?容易想到,满足 x+y∫(0..1) (x^2)*1/2 dx = 1/6可以想到,四个 0 到 1 之间的随机数之和小于 1 的概率就等于四维立方体一角的“体积”,它的“底面”是一个体积为 1/6 的三维体,在第四维上对其进行积分便可得到其“体积”原创 2013-06-23 16:50:04 · 939 阅读 · 0 评论 -
数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序
数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序#include void sort(int a[], int mid, int len){int i=0, j, k;int temp = 0;for(j = mid; j {for( ;原创 2013-06-23 15:58:48 · 762 阅读 · 0 评论 -
算法之哈希表
hash表,有时候也被称为散列表。个人认为,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,但是数据查找十分麻烦;二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。 打个比方来说,所有的数据就好像许许多多的书本。如果这些书本是一本一本堆起来的,就好像链表或者线性表一样,整个数据会显转载 2013-06-26 15:47:36 · 435 阅读 · 0 评论 -
KMP字符串匹配算法
KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);而KMP算法,可以证明它的时间复杂度为O(m+n)。一、简单匹配算法 先来一个简单的匹配算法的函数。int Index_BF(char const *S, char const *T, int pos){ /*--------------本转载 2013-09-18 01:56:49 · 597 阅读 · 0 评论 -
判断一个单链表是否有环及环的链接点
给定一个单链表,只给出头指针h:1、如何判断是否存在环?2、如何知道环的长度?3、如何找出环的连接点在哪里?4、带环链表的长度是多少? 解法:1、对于问题1,使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。(龟兔赛跑)2、对于问题2,记录转载 2013-09-18 01:18:20 · 505 阅读 · 0 评论 -
找出链表的中间元素 与 链表排序
Q2 找出链表的中间元素 1 ListNode* find_midlist(ListNode* head) 2 { 3 ListNode *p1, *p2; 4 5 if (head == NULL || head->next == NULL) 6 { 7 return head; 8 } 9转载 2013-09-18 01:35:04 · 829 阅读 · 0 评论 -
使用socket实现同一台计算机进程间通信
使用socket实现进程间通信:(UNIX domain中面向连接通信) 使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。man unix内容如下:NAME( 名称) unix, PF_UNIX, AF_UNIX, PF_LOCAL, AF_LOCAL ? 用于本地内部进程通讯的套接 字。SYNOP转载 2013-10-03 23:37:43 · 5114 阅读 · 0 评论 -
A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效思路1:排序法 对集合A和集合B进行排序(升序,用快排,平均复杂度O(N*logN)),设置两个指针p和q,同时指向集合A和集合B的最小值,不相等的话移动*p和*q中较小值的指针,相等的话同时移动指针p和q,并且记下相等的数字,为交集的元素之一,依次操作,直到其中一个集合没有元素可比较为止。转载 2013-10-03 23:14:45 · 2355 阅读 · 0 评论 -
链表逆序输出(递归妙)
四种方式实现--从尾到头输出链表 方法一:借用栈倒序输出链表 方法二:先翻转链表,再顺序输出 方法三:递归实现,一个字妙,两个字很妙,三个字太妙了 方法四:用数组实现 方法一:借用栈倒序输出链表 因为栈是先进后出,把链表中的元素存进栈中,链表前面的元素在栈底,后面的元素在栈顶,链表后面的元素先出栈 方法二:先翻转链表,再转载 2013-09-18 01:26:52 · 1480 阅读 · 0 评论 -
找出单链表中倒数第 K个结点
int _tmain(int argc, _TCHAR* argv[]){ ListNode *pHead = NULL; CreateList(pHead); ListNode *p = pHead; ListNode *q = pHead; int k = 5; for (int i = 0 ; NULL != p && i ) {转载 2013-09-18 01:40:25 · 755 阅读 · 0 评论 -
大数相加 和 相乘
大数相加就是从个位开始一位位往前加.大数相乘就是把其中一个大数一位位和另一个数相乘累加.根据这个思想,编程实现#include#include#includeusing namespace std;bool islegaldata(const char *strdata)//判断该数字字符串数组是否有非数字字符,若有则返回false{转载 2013-09-18 01:47:36 · 764 阅读 · 0 评论 -
编程实现返回不大于某值的最大的2次幂
//其本质即找到该值二进制形式中最高位的1,其余位都置为0unsigned long Max2(unsigned long x){ unsigned long y=x; while(x) { y=x; x=x&(x-1); } return y;}unsigned long Max2_2(unsigned long x){ unsigne转载 2013-09-19 22:40:32 · 812 阅读 · 0 评论 -
约瑟夫环O(n)复杂度的解法
无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(n*m),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程。因此如果要追求效率,就要打破常规,实施一点数学策略。为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人(转载 2013-09-20 00:16:15 · 1212 阅读 · 0 评论 -
将4字节数据二进制模式中001替换为011
请写出实现下面功能的转换程序,输入一个32—bit整数(4字节),将此整数二进制中的模式001替换为011,将替换后结果作为返回值返回。 函数原形:long replace_pattern(long inputInt);*/long replace_pattern(long inputInt){int andmul=7,ormul=3,i=0,lasti=0,ste转载 2013-09-20 00:55:33 · 2119 阅读 · 0 评论 -
AI-迷宫寻路算法-深度优先搜索和广度优先搜索
状态空间搜索,如果按专业点的说法就是将问题求解过程表现为从初始状态到目标状态寻找这个路径的过程。通俗点说,就是在解一个问题时,找到一条解题的过程可以从求解的开始到问题的结果(好象并不通俗哦)。由于求解问题的过程中分枝有很多,主要是求解过程中求解条件的不确定性,不完备性造成的,使得求解的路径很多这就构成了一个图,我们说这个图就是状态空间。问题的求解实际上就是在这个图中找到一条路径可以从开始到结果。这转载 2014-06-10 22:01:55 · 2117 阅读 · 0 评论