![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法学习
掌握基本算法与应用来解决问题
Clover_00
这个作者很懒,什么都没留下…
展开
-
返回链表的中间结点
返回链表的中间结点给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。用快慢指针来写:Node* Fast;Node* Slow;先初始化,让Fast和Slow都指向第一个链表节点,然后让Fast每次移动两位,Slow每次移动一位,这样,Fast的路程就是Slow的两倍,当Fast到链表的末尾的时候,Slow也就到了链表的中间位置了。我们只需要返回Slow就可以了。结束的条件就是当Fast为NULL或者Fast->next为NULL。原创 2021-05-20 16:09:59 · 412 阅读 · 2 评论 -
找出这两个只出现一次的数字
找单身狗一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。int a[] = { 1, 2, 3, 9, 6, 0, 1, 2, 3, 9 };#include<stdio.h>#include<string.h>#include <assert.h>void search(int a[], int num){ assert(a); assert(num > 0); int *x = (in原创 2021-04-25 21:10:03 · 86 阅读 · 0 评论 -
实现一个通讯录
实现一个通讯录通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:1添加联系人信息2删除指定联系人信息3查找指定联系人信息4修改指定联系人信息5显示所有联系人信息6清空所有联系人7以名字排序所有联系人#define _CRT_SECURE_NO_WARNINGS#define MAX_PERSON 1000#include <stdio.h>#include <stdlib.h> #include <stri原创 2021-04-25 20:25:56 · 150 阅读 · 0 评论 -
模拟实现strstr
模拟实现strstr#include<stdio.h>#include<assert.h>//my_strstr char* my_strstr(const char *string, const char *strCharSet){ assert(string != NULL && strCharSet != NULL); const char *s = string; //主串 const char *t = strCharSet; //模原创 2021-04-25 20:09:56 · 42 阅读 · 0 评论 -
模拟实现memmove
模拟实现memmove#include<stdio.h>#include<assert.h>//my_memmovevoid * my_memmove(void* dest, const void*src, size_t num){ assert(dest); assert(src); if (dest<src) { //前->后 while (num--) { *(char *)dest = *(char *)src; dest原创 2021-04-25 20:08:04 · 52 阅读 · 0 评论 -
模拟实现memcpy
模拟实现memcpy#include<stdio.h>#include<assert.h>void *mymemcpy(void *str, const void *dst, size_t count) { void *ret = str; while (--count) { *(char*)str = *(char*)dst; str = (char*)str + 1; dst = (char*)dst + 1; } return ret;}i原创 2021-04-25 20:05:39 · 150 阅读 · 0 评论 -
模拟实现strcat
模拟实现strcat#include<stdio.h>#include<assert.h>//my_strcatchar* my_strcat(char* s, char* g)//实现字符串得追加{ assert(s&&g);//防止输入为空指针 while (*g != '\0')//先将空间大的数组走到'\0'处 { g++; } while (*s != '\0')//将空间小的数组追加到比较大的数组后面 { *g = *s;//原创 2021-04-25 20:02:24 · 48 阅读 · 0 评论 -
模拟实现strcmp
模拟实现strcmp#include<stdio.h>#include<assert.h>//模拟实现strcmpint Cmp(const char* arr1, const char* arr2){ int i = 0; int len = 0; size_t len1 = strlen(arr1); size_t len2 = strlen(arr2); //判断哪个字符串长,使用长的做for循环条件 if (len1 >= len2) { l原创 2021-04-25 19:59:59 · 62 阅读 · 0 评论 -
模拟实现strcpy
模拟实现strcpy//my strcpychar* my_strcpy(char*strdest, char*strsrc){ if (strdest == NULL || strsrc == NULL) { return NULL; } char *address = strdest; while ((*strdest++ = *strsrc++) != '\0'){} return address;}int main(){ char src[] = "abcdef";原创 2021-04-25 19:56:24 · 51 阅读 · 0 评论 -
模拟实现strlen
模拟实现strlen#include<stdio.h>#include<stdlib.h>#include<assert.h>int my_strlen(const char *p){ int count = 0; assert(p); while (*p != '\0') { count++; p++; } return count;}int main(){ const char arr[] = "abcdef"; int re原创 2021-04-25 19:54:22 · 29 阅读 · 0 评论 -
字符串循环左移k位
字符串左移k位实现一个函数,可以左旋字符串中的k个字符例如:ABCD左旋一个字符得到BCDAABCD左旋两个字符得到CDAB#include <stdio.h>#include <string.h>#include <stdlib.h>void spin(char *a, int n, int k){ char t[100] = { '\0' }; strcpy(t, a + k); strcpy(t + n - k, a); for (int原创 2021-04-19 14:17:56 · 244 阅读 · 0 评论 -
判断一个字符串是否为另外一个字符串旋转之后的字符串。
判断一个字符串是否为另外一个字符串旋转之后的字符串。例如:给定s1 =AABCD和s2 = BCDAA,返回1。给定s1=abcd和s2=ACBD,返回0。AABCD左旋一个字符得到ABCDAAABCD左旋两个字符得到BCDAAAABCD右旋一个字符得到DAABC#include <stdio.h>#include <string.h>#include <stdlib.h>int comper(char* a, char* b, int n){原创 2021-04-19 14:13:17 · 99 阅读 · 0 评论 -
用递归求解汉诺塔问题
public class Hanoi { public static void main(String[] args) { // TODO Auto-generated method stub hnt(3,"a","b","c"); } /*n为盘子的个数 第一个字符(a)为起始的柱子 第二个字符(b)为目标的柱子 第三个字符(c)为辅助的柱子*/ //把n个柱子以a为起始,以c为辅助,移到b static void hnt(int n,String原创 2021-04-17 09:47:24 · 87 阅读 · 0 评论 -
交换两数,不用辅助空间
交换两数,不用辅助空间用代码如何交换两个数,一般我们都会想到用第三个辅助的数(空间),比如:#include<stdio.h>int main(){int a=1;int b=10;int temp;printf("a=%d,b=%d\n", a, b);temp=a;a=b;b=temp;printf("a=%d,b=%d\n", a, b);return 0;}结果如下:但是如果我们要求不使用额外的辅助空间呢?我们可以想到加法,让temp的值为a+b原创 2021-04-17 09:45:44 · 174 阅读 · 0 评论 -
打印杨辉三角
打印杨辉三角杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。规律如下:1.每行端点与结尾的数为12.每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,原创 2021-04-17 09:38:46 · 74 阅读 · 0 评论 -
冒泡排序算法
冒泡排序算法它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。冒泡排序算法的运作如下:1、比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。2、对每一对相邻元素作同样的工作,从开始第一对到结原创 2021-04-10 11:18:33 · 143 阅读 · 0 评论 -
用递归法求两个数的最大公约数
用递归法求两个数的最大公约数求两个数的最大公约数的思路是,用辗转现除法辗转相除法求两个数的最大公约数的步骤如下:先用小的一个数除大的一个数,得第一个余数;再用第一个余数除小的一个数,得第二个余数;又用第二个余数除第一个余数,得第三个余数;这样逐次用后一个数去除前一个余数,直到余数是0为止.那么,最后一个除数就是所求的最大公约数(如果最后的除数是1,那么原来的两个数是互质数)。例如:求1515和600的最大公约数,第一次:用600除1515,商2余315;第二次:用315除600,商1余28原创 2021-03-29 21:30:28 · 10324 阅读 · 0 评论 -
出现k次与出现一次
数组中只有一个数出现了一次,其余的数都出现了k次,怎么找到这个数?例如:5,5,5,2,2,2,4,6,6,6我们要找到4这个数。我们第一时间想到的应该就是直接统计每个数的个数,然后输出个数为一的那个数,在这里我分享另外一个办法。我们先了解一个有趣的现象,在2进制中如果有两个一样的数做不进位的加法,结果是什么?例如:3+3转换为2进制就是0011+0011=0000(不需要进位)5+5=0101+0101=0000(不需要进位)也就是说2个一样的2进制数做不进位的加法等于0我们再来看10个一原创 2021-03-27 19:45:58 · 231 阅读 · 0 评论 -
统计一个二进制数中“1”的个数
统计一个二进制数中“1”的个数首先将一个10进制的数变成2进制的数输出,方便查看使用字符串的拼接来实现(只考虑在int范围内的数),代码如下:Scanner sc=new Scanner(System.in); int num=sc.nextInt(); int n=num;//复制一个备用String str=""; while(num!=0) { str = num%2+str; num = num/2; }System.out.println(str);原创 2021-03-27 16:18:26 · 161 阅读 · 0 评论 -
如何找数组中唯一重复的数?
开始学习蓝桥杯算法课原创 2021-03-27 11:02:04 · 682 阅读 · 1 评论