算法与数据结构
赏星乐事
这个作者很懒,什么都没留下…
展开
-
如何判断一个数组中的数值是否连续相邻
问题 一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现;0是个例外,可以反复出现。设计一个算法,当从该数列中随意选取5个数值时,判断这5个数值是否连续相邻。需要注意一下4点: 1.5个数值原创 2017-07-15 21:51:16 · 12092 阅读 · 0 评论 -
如何判断数组是否存在重复元素
假设数组a有N个元素,元素的取值为1~N,如何判断数组是否存在重复元素 方法一:对数组进行排序,然后比较相邻的元素是否相同。时间复杂度为O(nlogn),空间复杂度为O(1); 代码int comp(const void *a,const void *b){ return (*(int *)a -*(int *)b);}int isArrayRepeat(int* a,int n){原创 2017-07-31 15:43:35 · 1642 阅读 · 0 评论 -
如何重新排列数组使得数组左边为奇数,右边为偶数
给定一个存放整数的数组,如何重新排列数组使得数组左边为奇数,右边为偶数?要求:空间复杂度为O(1),时间复杂度为O(n); 代码#include <iostream>using namespace std;void Swap(int &a,int &b){ int temp = a; a = b; b = temp;}void ReverseArray(int a原创 2017-07-31 15:57:46 · 1672 阅读 · 2 评论 -
如何找出一个数组中第二大的数
代码#include <stdio.h>const int MINNUMBER = -32767;int FindSecMax(int data[],int count){ int maxnumber = data[0]; int sec_max = MINNUMBER; for(int i = 1;i<count;i++){ if(data[i]>ma原创 2017-07-31 16:21:04 · 856 阅读 · 0 评论 -
二叉树的二叉链表表示与实现
二叉树的特点是每个结点至多只有两棵子树,且二叉树有左右字子树之分,次序不能任意颠倒。二叉树的存储结构可以用顺序存储和链式存储来存储。二叉树一般使用链式存储结构,由二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左右孩子的指针构成,即二叉树的链表结点中包含3个域,这种结点结构的二叉树存储结构称之为二叉链表。typedef struct tnode { elemtype原创 2017-08-08 10:21:13 · 2099 阅读 · 0 评论 -
单链表的插入、删除
代码Status InsertList(LinkList head,DataType x,int i){ ListNode *p; p = head; int j = 1; while(p->next&&j<i){ p = p->next; ++j; } if(p == NULL) {原创 2017-08-01 13:52:58 · 217 阅读 · 0 评论 -
如何判断一个整数x是否可以表示成n个连续正整数的和
代码#include #include int main(){ int m = 0,n =0,start = 0,end = 0,flag =0; float temp =0.0; scanf("%d",&m); scanf("%d",&n); temp = (float)m/n-(float)(n-1)/2; if(temp==(in原创 2017-08-01 13:53:21 · 2050 阅读 · 0 评论 -
如何寻找数组中的最大值和最小值
代码#include void GetMaxAndMin(int *arr,int len,int& Max,int &Min){ Max = arr[0]; Min = arr[0]; for(int i = 2;i1;i+=2){ if(NULL==arr[i+1]) { if(arr[i]>Max)原创 2017-08-01 13:55:12 · 1802 阅读 · 1 评论 -
Dijkstra 算法的 C++ 实现
Dijkstra算法 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,是广度优先算法的一种,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。其基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原原创 2017-08-11 15:23:34 · 541 阅读 · 0 评论 -
MIT HAKMEM算法
代码如下:int bitcount(unsigned int n) { unsigned int tmp; tmp = n - ((n >> 1) & 033333333333) - ((n >> 2) & 011111111111); tmp = (tmp + (tmp >> 3)) & 030707070707;原创 2017-08-18 16:22:48 · 927 阅读 · 0 评论 -
查找字符串中无重复最长子串的长度
题目:输入是一个字符串,找出没有重复字符的最长子字符串的长度 示例: “abcabcbb”最长子串(abc)长度为3 “bbbbbbb”最长子串(b)长度为1 “abdevbac”最长子串(bdev)长度4//O(N^2)的时间复杂度 int max_unique_substring2(char * str) { int i,j; int begin;原创 2017-08-18 21:18:04 · 605 阅读 · 1 评论 -
如何找出数列中符合条件的数对的个数
一个整数数组,元素取值范围可能是1~N中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1; 代码#include <stdio.h>void FixedSum(int* a,int n,int d){ for(int i = 0,j = n-1;i<n&&j>=0&&i<j;){ if(a[i]+a[j]<d)原创 2017-07-31 15:25:28 · 788 阅读 · 0 评论 -
如何找出数组中唯一的重复元素
题目 数组a[N],1至N-1,这N-1个数存放在a[N]中,其中某个数重复一次,写一个函数,找出被重复的数字。要求每个数组元素只能访问一次,不用辅助存储空间; 方法 数学求和法 代码#include <stdio.h>void xor_findDup(int *a,int N){ int tmp1 = 0; int tmp2 = 0; for(int i = 0;原创 2017-07-31 12:02:40 · 640 阅读 · 1 评论 -
如何在O(n)的时间复杂度内找出数组中出现次数超过了一半的数
分析 重点是时间复杂度只能在O(n)内; 代码#include <stdio.h>int FindMostApperse(int *num,int len){ int candicate = 0; int count = 0; for(int i = 0;i<len;i++) { if(count == 0) {原创 2017-07-31 11:26:02 · 370 阅读 · 0 评论 -
如何用递归实现数组求和
问题 给定一个含有n个元素的整型数组a,求a中所有元素的和。 解法 1.不递归#include <stdio.h>int main(){ int a[] = { 3,6,8,2,1}; int i; int len = sizeof(a)/sizeof(a[0]); int sum = 0; for(i = 0;i<len;i++) {原创 2017-07-17 09:36:27 · 2472 阅读 · 0 评论 -
如何用一个for循环打印出一个二维数组
解析 常规的可以通过两层for循环嵌套来进行二维数组的输出,设二维数组array[MAXX][MAXY],其中MAXX表示是二维数组的行数,MAXY表示的是二维数组的列数。 代码#include <stdio.h>#define MAXX 2#define MAXY 3void printArray(){ int array[MAXX][MAXY] = { 1,2,3,4,原创 2017-07-17 09:59:36 · 11266 阅读 · 1 评论 -
在顺序表中插入和删除一个结点平均移动多少个结点
解析 在等概率情况下,顺序表中插入一个结点需要平均移动n/2个结点。删除一个结点需要平均移动(n-1)/2个结点。具体的移动次数取决于顺序表的长度n以及需插入或删除的位置i,i越近n,则所需移动的结点数越少。原创 2017-07-17 10:06:42 · 18588 阅读 · 1 评论 -
单链表的中间元素
node *search(node *head){ int i = 0; int j = 0; node *current = NULL; node *middle = NULL; current = middle = head->next; while(current!=NULL) { if(i/2>j)原创 2017-07-21 09:43:20 · 441 阅读 · 0 评论 -
单链表的测长和打印和节点查找、插入、删除、逆置
//返回单链表的长度int length(node *head){ int len = 0; node *p; p = head->next; while(p!=NULL) //遍历链表 { len++; p = p->next; } return len;}//打印单链表void print原创 2017-07-21 09:43:36 · 436 阅读 · 0 评论 -
如何用递归算法判断一个数组是否是递增
分析 判断一个数组中的元素是否递增,首先想到一定是遍历数组,然后判断相邻的两个数组元素的大小是否满足小标小的元素其值也越小。如果不满足,则不是递增数组。 1.如果数组只有一个元素,则是递增 2,如果数组的元素大于等于2,则先比较最后两个元素是否递增,如果最后两个元素递增,则再递归比较除去最后一个元素的前n-1个元素是否递增。 代码#include <stdio.h>bool isIncrea原创 2017-07-18 09:21:14 · 2751 阅读 · 0 评论 -
如何分别使用递归与非递归实现二分查找算法
///非递归算法#include <stdio.h>int BinarySearch(int array[],int len,int findData){ if(array==NULL||len<= 0) return -1; int start = 0; int end = len -1; while(start<end){ in原创 2017-07-30 21:37:35 · 298 阅读 · 0 评论 -
如何在排序数组中,找出给定数字出现的次数
题目 eg 数组[1,2,2,2,3]中2的出现次数是3次;#include <stdio.h>int BinarySearch(int *a,int length,int num,bool isLeft){ int left = 0,right = length -1; int last = 0; while(left< = right){ int m原创 2017-07-30 21:50:30 · 341 阅读 · 0 评论 -
如何计算两个有序整型数组的交集
eg a = 0,1,2,3,4 b = 1,3,5,7,9 那么他们的交集为{1,3} 代码int maxed(int array1[],int n1,int array2[],int n2,int* mixed){ int i = 0,j = 0,k = 0; while(i<n1&&j<n2){ if(array1[i]==array2[j]){原创 2017-07-31 10:18:04 · 570 阅读 · 0 评论 -
如何找出数组中重复次数最多的数
eg 数组{1,1,2,2,3,4,4,4,4,5,5,5,6,6} 元素1出现的次数为2, 元素2出现的次数为2,元素3出现的次数为1,元素4出现的次数为4,元素5出现的次数为3,元素6出现的次数为2 所以输出应该为元素4. 代码int GetMaxNum(int *arr,int len,int& num){ int index = arr[0]; int i;原创 2017-07-31 11:13:02 · 16569 阅读 · 9 评论 -
题目描述
给定两个升序排列的单向链表 a、 b ,请设计一个方法合并 a和 b 且合并后保持降序有序。 例如: a : 5->10->15->20; b: 6->7->25 合并后为: 25->20->15->10->7->6->5#include<stdio.h> #include<stdlib.h> typedef struct node{ char data; stru原创 2017-08-22 14:14:38 · 341 阅读 · 0 评论