算法与数据结构
火炙宸熙
让未来的自己感谢现在的你
展开
-
可乐瓶盖问题
可乐瓶盖问题每3个瓶盖可兑换一瓶可乐,现在有30个人,要保证每个人都能喝到一瓶可乐,总共最少需要买多少瓶可乐? 分析: 假设总共需要买x瓶可乐。则有: x + x/3 + x/9 + x/27 +…+ = x(1 + 1/3 + 1/9 + 1/27+….) 由等比数列求和公式 可知上式等于:x(1 + 1/3 + 1/9 + 1/27原创 2016-08-19 14:03:37 · 1083 阅读 · 0 评论 -
查找字符串中出现一次且第一次出现的字符
原理:利用哈希表的算法进行查找,创建一个能存储256个数的数组,第一次对出现的字符进行统计,第二次查找出现一次的字符并返回.#include#includechar FirstNotRepeatingChar(char *pString){if (pString == NULL){return '\0';}const int tableSize原创 2016-08-09 20:45:21 · 1795 阅读 · 0 评论 -
移除排序数组中重复元素
#include#includeusing namespace std;class Solution{public:int removeDuplicates(vector&nums){if (nums.empty())return 0;int index = 0;for (int i = 1; i {if (nums[index] !=原创 2016-08-10 03:57:31 · 407 阅读 · 0 评论 -
原串翻转
原串翻转题目描述请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的长度小于等于5000。测试样例: "This is nowcoder" 返回:"redocwon si sihT"代码:class Reverse {public:原创 2016-09-07 22:57:33 · 260 阅读 · 0 评论 -
明明的随机数
明明的随机数题目描述明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。Input Param n原创 2016-09-08 07:19:50 · 306 阅读 · 0 评论 -
顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。#include <cstdio>void PrintMatrixInCircle(int** numbers, int columns, int rows, int start);void printNumber(int number);void PrintMatrixClockwisely(int** numbers, int原创 2017-01-23 21:13:16 · 194 阅读 · 0 评论 -
二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。 例如 : 把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。int NumberOf1(int n){ int count = 0; while (n) { ++count; n = (n - 1) & n; } return cou原创 2017-01-23 21:28:26 · 202 阅读 · 0 评论 -
希尔排序
#include<cstdio>void ShellSort(int a[], int n){ int d, j, x, i; d = n/2; while(d>=1) //循环至增量为1时结束 { for(i = d; i < n; i++) { x = a[i]; //获取序列原创 2017-01-25 11:30:55 · 201 阅读 · 0 评论 -
归并排序
#include<cstdio>void Mergearray(int *a, int left, int mid, int right, int *tmp) { int i = left; int j = mid +1; int k = 0; int m = mid; int n = right; //二路归并 while(i <= m &原创 2017-01-25 11:52:47 · 201 阅读 · 0 评论 -
合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 照递增排序的。ListNode* Merge(ListNode* pHead1, ListNode* pHead2){ if(pHead1 == nullptr) return pHead2; else if(pHead2 == nullptr) return pHead1; L原创 2017-01-28 13:51:45 · 244 阅读 · 0 评论 -
树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构struct BinaryTreeNode{ double m_dbValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};bool DoesTree1HaveTree2(BinaryTreeNode* pR原创 2017-01-28 13:57:56 · 217 阅读 · 0 评论 -
二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。void MirrorRecursively(BinaryTreeNode *pNode){ if((pNode == nullptr) || (pNode->m_pLeft == nullptr && pNode->m_pRight)) return; BinaryTreeNode *pTemp = pNod原创 2017-01-28 14:04:42 · 241 阅读 · 0 评论 -
树的基本操作
//二叉树的二叉链表节点结构定义typedef char TElemType;typedef struct BiTNode{TElemType data;struct BiTNode *lchild, Rchild;}BiTNode, *BiTree;//前序遍历void PreOrderTraverse(BiTree T){if(T ==NULL)原创 2016-08-09 19:32:20 · 191 阅读 · 0 评论 -
链队列
typedef struct QNode{QElemType data;struct QNode *next;}QNode, *QueuePtr;typedef struct{QueuePtr front, rear;}LinkQueue;bool EnQueue(LinkQueue *Q, QElemType e){QueuePtr s =原创 2016-08-09 19:30:14 · 169 阅读 · 0 评论 -
线性链表
typedef ElemType int;typedef struct Node{ElemType data;struct Node *next;}Node;typedef struct Node *linkList;bool GetElem(linkList L, int i, ElemType *e){int j;linkList p;p原创 2016-08-09 19:15:44 · 275 阅读 · 0 评论 -
最大公约数
最大公约数最大公约数:如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。算法思想: 例如:求222,407 第一步: 用较大数407取余222 得 185 第二步:用余数185 和 222 取余, 222 % 185 = 37 第三步:用余数37 和 185 取余, 185 % 37 = 0 至此,可以得出余数为37 Java 实现代码如下:原创 2016-08-19 14:24:24 · 302 阅读 · 0 评论 -
冒泡排序算法
#include#include#include#define NUM 10/*冒泡排序*/void bubbleSort(int a[], int n){int tmp = 0;for (int i = 0; i {for (int j = 0; j {if (a[j] > a[j + 1]){tmp = a[j]原创 2016-08-09 17:08:40 · 253 阅读 · 0 评论 -
一维数组子数组的最大和
#include#include#includeint max(int a, int b){return a > b ? a : b;}int MaxSum(int *A, int n){int i;int inital = A[n - 1];int nSum = A[n - 1];for (i = n - 2; i >= 0; i-原创 2016-08-09 16:51:39 · 255 阅读 · 0 评论 -
选择排序
#include#include#include#define NUM 10void selectSort(int arr[], int n){int tmp = 0;for (int i = 0; i {for (int j = i + 1; j {if (arr[i] > arr[j]){tmp = arr[i];arr[原创 2016-08-09 17:22:46 · 171 阅读 · 0 评论 -
希尔排序
#include#include#include#define NUM 10void shellSort(int a[], int n){int step, i, j, tmp = 0 ;for (step = n / 2; step > 0; step /= 2){for (i = step; i {for (j = i - step; j >原创 2016-08-09 17:43:14 · 181 阅读 · 0 评论 -
二分法顺序查找
#include#include#define NUM 10int binary_search(int *a, int n, int key){int low, high, mid;low = 0; high = n-1;while (low {mid = (low + high) / 2;if (key > a[mid]){low =原创 2016-08-09 18:00:02 · 230 阅读 · 0 评论 -
插入排序
#include#include#include#define NUM 10void insertSort(int a[], int n) //从小到大排序{int insertVal, insertIndex;for (int i = 1; i {insertVal = a[i];insertIndex = i - 1;whil原创 2016-08-09 18:08:59 · 172 阅读 · 0 评论 -
链栈
typedef struct StackNode{SElemType data;struct StackNode *next;}StackNode, *LinkStackPtr;typdef struct LinkStack {LinkStackPtr top;int count;}LinkStack;bool Push(LinkStack *S,原创 2016-08-09 19:21:11 · 167 阅读 · 0 评论 -
顺序队列
typdef int QElemType;typdef struct {QElemType data[MAXSIZE];int front;int rear;}SqQueue;bool InitQueue(SqQueue *Q){Q->front = Q->rear = 0;return true;}int QueueLengt原创 2016-08-09 19:22:39 · 225 阅读 · 0 评论 -
顺序栈及共享栈
typedef SElemType int;#define MAXSIZE 100typdef struct {SElemType data[MAXSIZE];int top;}SqStack;bool Push(SqStack *S, SElemType e){if(S->top == MAXSIZE -1){return false;}原创 2016-08-09 19:19:07 · 408 阅读 · 0 评论 -
快速排序
算法原理:取最左边的元素作为一个基值base,将数组分为大于base的区间和小于base的区间,利用递归算法直到排序完成。下面是用c语言实现的产生随机数的算法。#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#define ARRAYLEN 10int Division(int a[], int left原创 2017-06-10 20:28:56 · 271 阅读 · 0 评论