
算法
文章平均质量分 68
C后台开发从入门到就业
这个作者很懒,什么都没留下…
展开
-
在字符串中找出第一个不重复的字符
要求时间复杂度为O(n)如:abcaddb; 找到的第一个不重复的字符为c,将输出c。思路:将字符的ASC码值当作下标,先遍历一遍,找出ASC码值最大的字符,以他的ASC码值+1为创建字符数组的个数;再遍历第二遍时,将字符的个数写入对应的ASC码值下标所指向的空间里。最后遍历第三遍,每看一个,就根据他的ASC码值去找他的个数,如果为一,这个数就为所求,就输出这个数。#inclu原创 2017-04-07 09:54:35 · 3154 阅读 · 0 评论 -
快速排序
时间复杂度:O(n*logn)定义:在一组无序的数列中,指定一个数为基准值,遍历数列,将比其小的放在左边,比其大的放在右边。这样基准值所在位置即为排序后的最终位置,保持不动。再将基准值左右的数组进行递归。,直到中间只有一个数结束。方法一:覆盖法:将第一个元素当成基准值,存储起来。I和J分别指向数组的首位。从后面向前找到比基准值小的数,将I所指的值覆盖,I再向后找比基准值大的数,覆盖原创 2017-04-10 20:29:56 · 358 阅读 · 0 评论 -
快速排序(递归法与迭代法)
用递归法:代码简洁,但运行速度很慢;用迭代法:代码略多,但运行速度很快。本文快速排序方法:用两个指针i和j,分别指向传进来的低位地址和高位地址。去中间的数为基准值。i从左向右移动,碰到比基准值小的数就继续+1,直至i所指向的数为不小于基准值为止。j从右向左移动,碰到比基准值大的数就继续-1,直至j所指向的数为不大于基准值为止。此时如果满足i小于等于j,就交换i和j所指向数的值,然后i+原创 2017-05-03 16:26:50 · 7692 阅读 · 0 评论 -
链表的排序
链表的排序和数组的排序思想是一样的。区别在于:数组时两个数之间的交换;而链表是每个节点之间的连接的变化。不要试图用数组的交换思想来做链表排序,那样会很麻烦。只需要将需要的节点在原数组中删掉,形成一个新的链表。直至最后删掉原来数组中最后一个节点,加到排好序的新链表中就完成排序了。思想:遍历链表,找到最小数据的节点。将此节点在原链表中删掉,让这个节点成为新链表的头结点。然后,再在原链表中找原创 2017-05-03 17:02:10 · 626 阅读 · 0 评论 -
复制复杂(多指针)链表
题目:复杂链表的复制。 在此链表中,每个节点不光含有一个指向下一个节点的next指针,还有一个指针any,指向链表中任意节点或者 NULL。如图: __________ V | A ---> B ---> C ---> D ---> E --->F原创 2017-05-03 17:28:55 · 433 阅读 · 0 评论 -
输出链表倒数第K个节点
题目:输入一个链表,输出该链表倒数第K个节点。方法1:想获取第K个节点,只要知道整个链表的长度n即可,第K个节点为:从链表头起第 n-k+1个节点。此算法的缺陷是需要遍历2次链表。方法2: 设置2个指针,再设置一个步长为:k - 1,即第一个指针指向的位置和第二个指针相差 k -1个节点。当第二个节点走到最后一个节点的时候,第一个指针刚好就是第K个节原创 2017-05-03 18:13:44 · 638 阅读 · 0 评论 -
用两个栈实现队列
栈:先进后出。队列:先进先出思想:用两个栈来模拟队列:一个用来模拟入队列;一个用来模拟出队列。当需要入队列时:先将二号栈中的所有数据压入一号栈,再将数据压入一号栈。当需要出队列时:先将一号栈中的所有数据压入二号站,再从二号栈中执行出栈操作。代码:#include #include #include #define SIZE 10 //栈的大小struct原创 2017-05-03 18:25:16 · 229 阅读 · 0 评论 -
最大子序列和问题O(N)
问题描述:给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大。解决思想:要想让时间复杂度为O(N),就只能用一个for(或while等的)循环。即遍历一遍数组。1.我们可以从头遍历,把每一个元素相加,每加一次就与最大和进行比较,留下最大的;2. 小于0的元素不可能成为最大子序列的第一或最后一个值(把它去掉的子原创 2017-11-30 10:58:05 · 652 阅读 · 0 评论 -
判断单链表中是否有环/两列表是否相交系列问题及C++实现
题目:1.给一个单链表,判断其中是否有环的存在;2.如果存在环,求出环上节点的个数;3.如果存在环,找出环的入口点;4.如果存在环,求出链表的长度;5.如果存在环,求出环上距离任意一个节点最远的点(对面节点);6.(扩展)如何判断两个无环链表是否相交;7.(扩展)如果相交,求出第一个相交的节点;解答:1.给一个单链表,判断其中是否有环的存在;运用快慢指针来确定:每次快指针走两步,慢指针走一步。如果...原创 2018-05-30 17:06:44 · 706 阅读 · 0 评论 -
C++实现动态规划解决在数组中找出指定和的数字
题目:给定一些数,要求找出相加等于100的所有数。有唯一解。例:输入:1,4,57,63,32输出:1,4,63,32思路:从前往后遍历,每个数字有两种对待方法——要或者不要。所以用到递归。先要,之后进行后续递归。如果没有得到结果,就不要这个数字,继续递归。都不行的话就是没有解。代码:#include<iostream>#include<vector>using nam...原创 2018-06-22 15:28:19 · 1872 阅读 · 0 评论 -
(C++实现)输入两个链表,找出它们的第一个公共结点
方法一:先数出两条链表的长度,得到长度差d,先将长链表从头结点往后走d步,之后第二个链表从头开始,两个链表一起一步一步走,直到两个链表的节点第一次相等为止,此时指针位置即为所求。 ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { ListNode *p1=pHead1; L...原创 2018-06-22 21:08:42 · 1737 阅读 · 1 评论 -
C语言中利用栈检测括号是否匹配
检测括号是否匹配的算法中,栈的特性是最符合括号特点的。栈的先进后出将括号的匹配正好完美实现。思想:从字符串开头向后逐个检测,检测到除括号外的元素就跳过。检测到左括号时,就进行入栈操作,继续向后检测。检测到有括号时,就检查栈顶元素是否是匹配的左括号。若不匹配,则直接返回错误信号,使程序结束;若匹配,进行出栈操作,继续向后检测。结束时,要判断栈是否为空,若不为空,则括号不匹配;若为空,则括号匹原创 2017-05-03 11:55:30 · 9407 阅读 · 0 评论 -
C语言实现约瑟夫环问题
一共有N个人,围成一圈,从一开始报数,数到M的人出局,然后重新开始报数。算出出局的人的顺序;如果最后只能剩下一个人,请问是几号?代码:#include #include #define N 9 //游戏参与人数#define M 3 //死亡数字//声明链表节点typedef struct node { int data; struct node *next;}linkl原创 2017-05-03 11:53:22 · 7332 阅读 · 0 评论 -
折半查找
折半查找:在按从小到大顺序的数组中。先查找中间的元素,将中间的元素与要查找的元素作比较。如果要查找的元素比中间元素大,则用右面一半的元素再进行折半查找(递归);如果要查找的元素比中间元素小,则用左面一半的元素再进行折半查找。直至找到元素或者没有元素可找为止。代码:#include //参数分别为:返回-1(没找到)或者元素下标(找到)bin_find(数组首地址,//第一个下标,最后原创 2017-05-02 21:08:08 · 282 阅读 · 0 评论 -
找出连续子数组的最大和
题目:输入一个整数数组,数组里有正数也有负数,数组中的一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n).例如:输入数组为{1,-2,3,10,-4,7,2,-5},最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18.思路:由于时间复杂度为O(n),所以只能一次一次遍历。用一个变量sum来从头遍历,将走过的数都加起来,加一次,就和变量m原创 2017-04-07 10:11:47 · 720 阅读 · 0 评论 -
用C语言找迷宫路径
给定一个二维数组,2为墙,0为路。找出所有路径并打印出来。方法一:用递归,打印出直观的图形来显示路径。PS:要将走过的路径做一个标记,换成一个和墙与路不一样的值,当走到死路的时候要在回去时将道路改回原来的0.这样,我们就可以用上下左右四个方向进行递归,每到一次终点就打印一次,一共有几条路径,就打印几个二维数组出来。#include #include #include voi原创 2017-04-07 10:32:51 · 5882 阅读 · 6 评论 -
将一个字符串的空格用%20来代替
题目:给定一个字符串,将字符串里的所有空格替换成%20。注意:空格替换成%20,是将1个字符变成3个字符,注意指针的移动个数。#include #include #include int length(char *p){ int blank = 0; for(;(*p)!='\0';p++) for(;(*p)==原创 2017-03-29 09:56:17 · 1291 阅读 · 0 评论 -
调整数组顺序,使得奇数在前偶数在后,分别保证奇数和偶数之间的相对位置不变
题目:输入一个整形数组,将数组重新排序,使得所有奇数在前偶数在后,并使奇数之间和偶数之间的相对位置爆出不变。思想:从数组开头开始遍历所有数组。当碰到偶数时,将偶数打包,即记录到目前为止偶数的个数,把这些偶数看成一个整体;当碰到奇数时,将这个奇数与前面的偶数整体对调位置。#include #include void nuo(int *a,int j,int nu)原创 2017-03-29 09:58:11 · 2878 阅读 · 0 评论 -
插入排序
时间复杂度:O(n^2)定义:假定第一个元素有序,然后将后面的元素按照顺序依次插入前面的序列,使数列依然有序。函数一:#include int insert(int* a, int len){ int i = 0, j = 0, tmp = 0; for(i=0; i<len-1; i++) { j = i; tmp = a[i+1]; while(tmp原创 2017-04-10 20:27:36 · 332 阅读 · 0 评论 -
选择排序
时间复杂度:O(n^2)定义:在一组无序的数列中,找到比第一个值小的值与第一个值交换,然后下一次从第二值开始找到比其小的与其交换,直到数列跑完。函数:includevoid choose(char* a, int n){ int i=0,j=0,tmp=0; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(a[i]>a[j]){原创 2017-04-10 20:29:16 · 336 阅读 · 0 评论 -
C语言写递归复制文件夹和文件
用文件操作写了一个含有复制粘贴部分功能的代码。(创建文件夹和查看文件属性为系统命令)执行格式:./copy -rf /root/Desktop/123/ /root/Desktop/456/./编译成执行文件的名字 递归复制 想要复制的文件 复制到的地方(要用绝对路径)#include#include#includevoid cdfile(char* from,cha原创 2017-04-10 21:27:00 · 2420 阅读 · 0 评论 -
C语言写cat命令
cat命令功能:在命令界面中显示文件里面的内容。输入命令格式:./mycat a.txt程序的执行文件 想打开的文件#include#include#includeint main(int argc,char* argv[]){ if(argc>2){ printf("输入参量太多,请输入一个想查看的文件\n"); exit(0); } if(arg原创 2017-04-10 21:37:43 · 3230 阅读 · 0 评论 -
C语言写getline(节省空间)
getline功能:将文件中的数据读取一行,存储在堆中,形成一个字符串。根据字符串个数分配120个空间,不够就加120,直到能存下为止。返回字符串首地址。并且存储所分配的空间和字符串长度。我将空间分配改成20个,不够再加20,知道能存下字符串为止。#include #include #includessize_t mygetline(char** line , size_t* le原创 2017-04-10 21:40:51 · 940 阅读 · 0 评论 -
检测“双重叠“字符串C++实现
用双指针进行遍历,当两个字符一样的时候再用循环判断是否是双重叠。#include <iostream>using namespace std;int main(){while(1){ string a; cin>>a; if(a.size()<1) continue; if(a=="q") return 0; int max=0,star=0...原创 2018-06-01 22:02:50 · 1094 阅读 · 0 评论