算法
huahuahailang
微信号:huahuahailang
欢迎一起技术交流。
展开
-
2013年3月算法练习(一)冒泡排序
#includeusing namespace std;int main(int argc,char *argv[]){ int a[10]; int i,j,t; cout for (i=0;i { cin>>a[i]; } cout for (j=0;j { for (i=0;i { if (a[i]>a[i+1])原创 2013-03-08 08:30:58 · 679 阅读 · 0 评论 -
将链表逆序操作
已知链表的表头为head,写一个函数将链表逆序操作。采用逆插入的方法。#includeusing namespace std;typedef struct node{ char data; struct node *next;}Node;Node *Reverse(Node *head){ Node *temp=(Node*)malloc(sizeof(原创 2013-04-05 17:17:11 · 905 阅读 · 0 评论 -
用1分钱,2分钱,5分钱组成一元钱的方式
用1分钱,2分钱,5分钱组成一元钱,列出所有的组合方式: #include#includeusing namespace std;int main(int argc,char *argv[]){ int m,n; int k=0; cout<<" 1 分"<<" 2 分"<<" 3分|"; cout<<" 1 分"<<" 2 分"<<" 3分|"; c原创 2013-04-05 21:58:40 · 3147 阅读 · 0 评论 -
删除单向链表中的某一个节点
已知一个单向链表的表头head,写出一个删除某一个节点的算法,要求先找到此节点,然后删除。#includeusing namespace std;typedef struct node{ int number; struct node *next;}Node;Node *Delete(Node *head,int key){ Node *node1=head原创 2013-04-05 22:33:25 · 52525 阅读 · 6 评论 -
两个有序的链表合成一个有序的链表
已知两个链表head1 和 head2 都各自升序排序,请合成一个链表并且依然有序。使用递归和非递归方法如下:用递归方法:#includeusing namespace std;typedef struct node{ int data; struct node *next;}Node;Node *Merge(Node *head1,Node*head2){原创 2013-04-05 15:08:55 · 951 阅读 · 0 评论 -
一个刚出生的奶牛,4年生一只,以后每年生一只,现在有一只刚出生的奶牛,问20年以后一共多少只奶牛?
题目:一个刚出生的奶牛,4年生一只奶牛,以后每年生一只,现在有一只刚出生的奶牛,问20年以后一共多少只奶牛?#includeusing namespace std;int function(int year){ int i; int num; num=1; for (i=1;i<=year;i++) { if (i>=4) { if (yea原创 2013-04-05 21:27:30 · 5259 阅读 · 2 评论 -
动态规划算法
一、定义:动态规划的过程是:每次的决策依赖于当前的状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,利用这种多阶段最优化决策来解决问题的过程就是动态规划。二、基本思想与策略:首先将待求解的问题分解成若干个子问题,按顺序求解各个子问题,后一个问题的解需要依赖前一个问题的解。在求解任一子问题时,列出所有可能的局部解,通过决策保留那些可能达到最优决策的解,丢弃其他决策的局原创 2013-04-08 16:02:52 · 823 阅读 · 0 评论 -
如何比较这两个字符串是否相等?
两个字符串相等的条件如下,字符串中的每个字母出现的次数都相等。例如:abbcd 和acdbb是相等的,因为a都出现1次,b都出现2次,c都出现3次,d都出现4次。解题思路:可以使用一个额外的数组,将第二个字符串赋给额外的数组,然后遍历第一个数组和额外的数组,找到相同的字符,则将额外数组中相同的字符赋值为空格。直到额外的数组中字符串全部为空为止。代码如下:#includeusin原创 2013-04-13 15:57:08 · 1352 阅读 · 0 评论 -
火星码问题
这里可以采用对进制辗转相除的逆过程来做答。程序如下:#includeusing namespace std;int main(){ int num=1; int a[11]; char b[11]; int c[11]={2,3,5,7,11,13,17,19,23,29,31}; char ch; int i=0,temp; int j; ci原创 2013-04-15 09:49:25 · 932 阅读 · 0 评论 -
如何在千万级别的用户中,找出积分最高的10个用户。
解题思路:这道题和编程之美上2.5 很相似。方法可以采用最小堆的方法。时间复杂度:O(NlogN )首先取10个人的积分进行排序。采用最小堆的方法,根节点存放的是第10个积分最高的用户。以后每来一个用户,都要与根节点比较,如果小于根节点,则继续读取下一个用户的积分。否则,当前用户与根节点交换,并重新进行一次堆排序。将最小的积分的用户放在根节点上。这样一直比较下去即可找到积分最高的10个用户原创 2013-04-13 16:29:27 · 968 阅读 · 0 评论 -
求大数平方根
#include #include #include //8const double EPS = 1e-3;int main(void){ freopen("b.txt","r",stdin); char str[35]; while( scanf("%s", str), strcmp(str, "0") )//不能直接输入double型变量,不然一定会出错转载 2013-04-17 11:34:15 · 1320 阅读 · 0 评论 -
多段图的最短路径问题-----动态规划法
对多段图,求最短路径,如图:对其使用动态规划法:阶段:将图中的顶点划分5个阶段,k状态:每个阶段有几种供选择的点s决策:当前状态应在前一个状态的基础上获得。决策需要满足规划方程规划方程:f(k)表示状态k到终点状态的最短距离。初始条件:f(k)=0;方程:f(k-1)=min{f(k)+W(k-1,k)}其中W(k-1,k)表示状态k-1到状态k的距离代码如下:原创 2013-06-06 22:27:01 · 45716 阅读 · 1 评论 -
归并排序实现
#include using namespace std;void merge(int A[],int temparray[],int lpos,int rpos,int rend){ int i,temppos,lend,numelements; temppos=lpos; lend=rpos-1; numelements=rend-lpos+1; while (lpos<=l原创 2013-08-23 09:22:39 · 682 阅读 · 0 评论 -
折半插入排序
#include using namespace std;void MergeSort(int x[],int N){ for (int i=1;i<N;i++) { int temp=x[i]; int low=0; int high=i-1; while (low<=high) { int mid=(low+high)/2; if (temp<=x原创 2013-08-23 10:16:48 · 777 阅读 · 0 评论 -
一个正整数分解成质因数
100=2*2*5*5;#includeusing namespace std;int main(){ long n,i; cout<<"\nPlease input a number :\n"; cin>>n; if(n==0) return 0; cout<<n<<"="; for(i=2;i<=n;i++) { while(n!=i) { if(n%原创 2013-09-10 15:15:46 · 1678 阅读 · 1 评论 -
各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
排序方式最坏时间复杂度最好时间复杂度平均时间复杂度空间复杂度稳定性 希尔排序 O(n^2)O (1)不稳定 快速排序O(n^2)O (nlogn)O (nlogn)O (logn)不稳定 堆排序O (nlogn)O (nlogn)O (nlogn)O (1)不稳定原创 2013-03-25 13:33:36 · 2096 阅读 · 0 评论 -
用算法实现将一个输入的数字颠倒(输入12345->54321),要求不调用任何系统函数,也不能将输入的数字转换为字符串作为中间过渡
如:123456789-------------------》987654321int num1=123456789;int num2=0;while (num1>0){ num2=num2*10+(num1%10); num1=num1/10;}cout原创 2013-09-10 15:09:44 · 3238 阅读 · 0 评论 -
char 组成的字符串循环右移N位
写一个函数,把char组成的字符串循环右移 #includeusing namespace std;void LoopMove1(char *str,int steps)//方法一{ int n=strlen(str)-steps; char *temp; temp=(char *)malloc(sizeof(char)*(strlen(str)+1)); st原创 2013-04-05 12:07:40 · 1075 阅读 · 0 评论 -
计算1+2+3+。。。。+n的值
采用公式来计算和,效率会快很多 #includeusing namespace std;int sum(int n){ return (1+n)*n/2;}int main(int argc, char* argv[]){ int n; cout<<"请输入n: "; cin>>n; cout<<"1+2+3+4+.....+n-1+n= "<<原创 2013-04-02 10:13:16 · 1258 阅读 · 1 评论 -
写一个函数,判断不同模式处理器的返回值
处理器有两种:Big_endian 、Little_endian 的模式Big_endian模式对操作数的存放方式是从高字节到低字节。高字节存放数字的低位,低字节存放数据的高位。Little_endian模式对操作数的存放方式是从低字节到高字节。低字节存放数字的低位,高字节存放数据的高位。如:0x1234内存地址:0x4000 0x4001Little_endian原创 2013-04-02 11:18:30 · 618 阅读 · 0 评论 -
2013年3月算法练习(三) 汉诺塔递归
#include#include#includeusing namespace std;ofstream fout("out.txt");void Move(int n,char i,char j){ fout<<"把"<<n<<"从"<<i<<"移动到"<<j<<"上面"<<endl;}void Hannoi(int n,char a,char b,char原创 2013-03-09 07:46:09 · 584 阅读 · 0 评论 -
2013年3月算法练习(二) 闰年
四年一闰,百年不闰,四百年再闰。所以2000年是闰年,2100年不是闰年.公历闰年四年一次,闰年时2月为29天,一年总天数为366天。计算方法为你所说的方法:年数可以被4整除即为闰年。#includeusing namespace std;int main(int argc,char *argv[]){ int year,month,days,flag; cout<原创 2013-03-08 08:32:09 · 1803 阅读 · 0 评论 -
2013年3月算法练习(六) C++抛出和捕捉异常
#include #includeusing namespace std;#define TYPE_CLASS 0 //抛出类异常#define TYPE_INT 1 //抛出整型异常#define TYPE_ENUM 2#define TYPE_FLOAT 3#define TYPE_DOUBLE 4typedef int TYPE;enum Week原创 2013-03-11 13:17:03 · 617 阅读 · 0 评论 -
2013年3月算法练习(七) 指针 与 数组 赋值地址
#includeusing namespace std;int main(int argc,char *argv[]){ int b[10]; int *t=b;//或者:int *t; t=&b[0]; int a[5][10]={1,2}; int (*p)[10]=a; memset(b,0,sizeof(b)); cout<<p<<end原创 2013-03-11 13:35:49 · 493 阅读 · 0 评论 -
2013年3月算法练习(四) 重载输入、输出
#include#includeusing namespace std;class Fruit;ostream &operator<<(ostream &out,const Fruit &s) ;istream &operator>>(istream &inn,const Fruit &s);class Fruit //定义一个类 Fruit{public: s原创 2013-03-11 09:39:16 · 643 阅读 · 0 评论 -
2013年3月算法练习(五) 文件输入、输出 .
#include#include#includeusing namespace std;int a(void){ return 110333;}int main(int argc,char *argv[]){ ofstream oftest; char filename[19]="huahua.txt"; oftest.open(filename,i原创 2013-03-11 10:39:33 · 539 阅读 · 0 评论 -
2013年3月算法练习(八) 指针 自增与自减
#includeusing namespace std;int main(int argc,char *argv[]){ char str[]="hua guang lu"; char *p=str;//char *p;p=&str[0] ; 一样的// char str[19][19]; char (*p)[19]=str; 初始化 char *tem=&str[1];原创 2013-03-11 13:39:38 · 626 阅读 · 0 评论 -
数据结构(一) 广度优先遍历 BFS
邻接矩阵:G=(V,E)A(i,j)=1: 若或是E(G)中的边A(i,j)=0; 若或不是E(G)中的边带权值的邻接矩阵:A(i,j)=Wij,若或是E(G)中的边A(i,j)=0 || 无穷大,若或不是E(G)中的边邻接矩阵表示法的空间复杂度为: S(n)=O(n^2) .邻接表:链式存储,结构: |data|adj| 邻接表中每个结点均有两原创 2013-03-12 16:14:20 · 955 阅读 · 0 评论 -
数据结构(二) 深度优先遍历 DFS
1、连通图的深度优先遍历算法思想 DFS(1) 、访问初始顶点V并标记顶点V已访问。(2) 、查找顶点V的第一个邻接顶点W。(3) 、若顶点V的邻接顶点W存在,则继续执行,否则回溯到V,再找V的另外一个未访问过的邻接节点。(4) 、若顶点W未被访问,则访问顶点W并标记顶点W已被访问。(5) 、继续查找顶点W的下一个临界顶点W,如果V取值Wi转到步骤(3),直到连通图中所有顶点全原创 2013-03-12 17:10:23 · 1900 阅读 · 1 评论 -
各种排序算法实现——基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
各种排序算法总结见http://blog.csdn.net/huahuahailang/article/details/8716434 一、基数排序#include#includeusing namespace std;#define N 13 //取13个数字#define d 3 //3位数字#define K 10 //10个筒子void RadixSor原创 2013-03-25 14:30:53 · 966 阅读 · 0 评论 -
检查链表是否有环?
使用两个指针,一个指针每次递增一步,另一个指针每次递增两步。代码如下:#includeusing namespace std;struct node{ char val; node *next;};bool check(node *head)//此函数复杂度为O(N) { if (head==NULL) { return false; }原创 2013-04-01 13:34:47 · 668 阅读 · 0 评论 -
关于C/C ++ 编译器的问题
如何判断一段程序是由C编译器编译的还是由C++编译器编译的?这个要通过代码来实现。如果用C++编译程序的话,系统会自定义一个宏:__cplusplus代码如下:#includeusing namespace std;int main(){#ifdef __cplusplus cout<<"C++";#else cout<<"C";#endif c原创 2013-04-01 14:56:00 · 483 阅读 · 0 评论 -
统计数x的二进制表示中1的个数
高效的算法:X=X&(X-1) 程序如下:#includeusing namespace std;int fun(int x){ int count=0; while (x) { count++; x=x&(x-1); } return count;}int main(int argc, char* argv[]){ in原创 2013-04-01 11:06:58 · 992 阅读 · 0 评论 -
找出数组中的第二大数字
写一个函数,找出数组中第二大的数字使用的是比较的方法:代码如下://找出数组中第二大的数#include#include#define N 15#define d 3using namespace std;int fun(int num[]){ int sec_max=-32767; int max=num[0]; int i; for (i原创 2013-04-01 13:57:48 · 923 阅读 · 0 评论 -
从文件中读取数据,排序之后输出到另一个文件中
文件中有一组数据,要求排序后输出到另一个文件中去两个知识点: 排序、文件操作代码如下:#include#include#includeusing namespace std;void Order(vector &data)//不加 & 符号的话,改变不了 data 向量中的数据。{ int count=data.size(); int i,j; int原创 2013-04-01 14:40:50 · 1716 阅读 · 0 评论 -
输入N,在屏幕上打印出N X N 的矩阵,使用动态内存分配 int ** num
输入3:输出:1 2 38 9 47 6 5 代码如下:#include#includeusing namespace std;int main(){ int N; int i,j; int count,m; int **num; cout<<"请输入N的值:"; cin>>N; num=(int **原创 2013-04-01 21:24:45 · 1107 阅读 · 0 评论 -
找出两个字符串中最长的公共字符串:如“abcdef” 和“yiewcdeacd”,则输出“cde”
#includeusing namespace std;void fun(char str1[],char str2[]){ int long_length=strlen(str1); int short_length=strlen(str2); int flag=0; int cnt=0; int max=0; int biaoji_j=0; int biaoji_i=原创 2013-10-08 22:09:25 · 878 阅读 · 0 评论