![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
杂篇
前期学习的一些杂七杂八东西,懒得整理了
星空的你
所有的博客都只是我的学习日记,把记忆留在CSDN上,并分享给别人是一件很有意义的事,若你发现了错误还请原谅并告知我,让我们共同进步。最后,星空的你,各自努力,顶峰处见!
展开
-
简单数组队列的创建及演示(Java日记二)
命名基本规范,因为是日记不想浪费太多时间在解释说明上。补充一个小知识点:使用RuntimeException而不是Exception的原因(简单理解就是想少写点代码),在最下方。import java.util.Scanner;public class Queue { public static void main(String[] args) { ArrQueue queue=new ArrQueue(3); Scanner scan=new S.原创 2022-03-18 08:10:31 · 459 阅读 · 0 评论 -
将两个有序数组合并为一个新的有序数组(Java实现)
不可否认的是Java确实C语言方便许多,这种写法比我在C中的那种写法要好代码如下:public class Test { public static void main(String[] args) { int[] arr1={1,3,5,7,9}; int[] arr2={2,4,6,}; int[] arr3=Test.combin(arr1,arr2); for (int i:arr3 ) {原创 2022-03-19 17:53:43 · 1729 阅读 · 0 评论 -
用递归解决迷宫问题,以及我对递归的一些思考(Java日记Ⅶ)
递归比循环难,首先是想不到使用递归,其次是递归比循环更绕,一不小心就会死龟,究其原因是一个视角的问题,所谓当局者迷,旁观者清,当我们在写循环的时候使用的是上帝视角,我们知道只有在循环体内的代码会被反复执行,而在使用递归时,我们是第一人称视角,我们所书写的函数中所有的代码都在循环写一个循环一个,所以感觉很乱不知道如何下手。我自己的解决方案:调整视角,将自己置于全局,而不是函数中,把递归想象成一个参数不断变化的循环在思考递归时想象自己在debug调试,每一次进入递归的入口它的上一次都卡在某个if中还没有原创 2022-03-22 14:58:52 · 628 阅读 · 0 评论 -
C#实现txt文件的增删改查
代码如下:using System;using System.Collections.Generic;using System.IO;namespace ConsoleApp1{ class Person { public string name; public string id; public string password; public string state; public strin原创 2022-04-01 22:56:33 · 2363 阅读 · 0 评论 -
使用递归自动创建二叉树及前中后序遍历的实现(Java日记十一)
代码超简单,使用一个辅助数组存每个结点的名字,我比较懒就使用了循环自动生成了A到Y作为树的名字,利用数学关系锁定数组下标的位置来找到对应的名字,至于遍历用递归来写实在是太简单了,我都懒得解释了,看代码就能理解,所谓的前中后无非就是把输出语句换个位置。代码如下:public class BTDemo { public static void main(String[] args) { char[] arr=new char[30]; int n=0;原创 2022-03-27 16:21:45 · 582 阅读 · 0 评论 -
八皇后问题最简解法(Java日记Ⅹ)
之前两篇文章介绍了一种思想的解法,不过之前的解法主要是解决全排列问题的,而八皇后问题其实还有另一种解法,这是目前我知道的最简单的解法,之前的思想是验证整个排列的数组而本章算法的思想是一个一个往里放,边放边验证这个位置是否可行,如果可行进入递归验证下一位,如果放到了最后一个位置下一位,说明上一个位置已成功,此时的n如果为8即可退出递归并把计数器加一,如果该位置不能放置,则会跳过该位置继续判断。代码如下:public class QueenDemo { public static void m原创 2022-03-25 16:24:28 · 607 阅读 · 0 评论 -
超详细,一步一说明使用Java自带的栈和列表构造一个简单计算器(Java日记Ⅵ)
首先声明一下我的这个计算器只能计算加减乘除(除法会丢失精度,因为我限制的int,你可以自己试着写个double的),几位数都行,但是只能是正整数和0,不能有括号自然也不能写负数,但是首位允许写负数。先记录一下,以后有机会再给这个计算器升级。如果不明白原理,推荐去bilibili搜索Java数据结构,有一个老师原理讲的很好,但是代码有点拉,所以以下的代码是我参照他的算法思想自己写的,因为对Java的一些写法不是很了解,写的途中查了很多资料,一共花了一下午的时间,总的来说这个东西不简单,写的时候发现了好多好原创 2022-03-20 18:49:14 · 373 阅读 · 0 评论 -
循环队列的创建及演示(Java日记三)
本篇只是日记不做过多的讲解,不明白公式(rear+1)%maxsize==front,(rear-front+maxsize)%maxsize如何推导请移步(2条消息) 循环队列中公式的推导,原理,超详解_星空的你的博客-CSDN博客代码如下:import java.util.Scanner;public class CircleQueueDemo { public static void main(String[] args) { CircleQue.原创 2022-03-18 15:37:55 · 899 阅读 · 0 评论 -
八皇后问题,为什么要使用递归,循环转递归的思考过程(Java日记Ⅷ)
说明:本篇旨在说明怎么想到使用递归,所使用的算法是最垃圾的也是最浅显易懂的(从零到七疯狂试探,没有任何优化),我最开始是想使用循环解决这个问题,但是并没有找到什么特别好的方法,只能一层一层套for循环,这个时候我其实就想到递归了,但为了能清晰的展现思路,我还是硬着头皮把它写出来了,这样更方便观察,能够让我们在把它转化成递归的时候让思路能够清晰直观,不至于不知道从何处下手。八皇后问题其实就是一个排列组合的问题,明白这一点后其实能减少许多不必要的试探,如果想看优化之后的递归代码请看下一篇Java日记Ⅸ。原创 2022-03-25 13:12:47 · 646 阅读 · 0 评论 -
基数排序算法详解,用最简的思想写最简的代码(C语言)
算法思想:依次按个、十、百、千等位排序最后将结果还给原数组,每一次大循环排一位。代码及说明如下:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#define N 10int main() { int arr[N] = { 52, 20, 4, 10, 17, 39, 8, 300, 60, 81 }; radixSort(arr); for (int i = 0; i < 10; i++) { printf("%原创 2022-03-26 12:59:12 · 1496 阅读 · 0 评论 -
约瑟夫问题与循环链表(Java日记Ⅴ)
总的来说没有太大难度,主要是当begin_index和count为一时程序容易出问题,要单独处理,另外我这里first在后cur在前,当begin_index为一时要单独处理first让它指向cur的前一位,代码写的不是特别满意,感觉有些地方可以简化,奈何今天事情太多,没时间重构了,就这样吧,毕竟也不是什么大问题。代码如下:public class YSFQuestion { public static void main(String[] args) { CircleLi原创 2022-03-19 15:45:15 · 308 阅读 · 0 评论 -
单链表的创建及基本操作函数(Java日记Ⅳ)
之前写过C语言的文章,Java思想不变只是换种写法,因此不做过多解释说明,代码里已经很清晰public class LinkListDemo { public static void main(String[] args) { LinkList lst=new LinkList(); lst.add(1,"Error"); lst.add(2,"Starry"); lst.insert(3,3,"lian");原创 2022-03-18 18:44:48 · 628 阅读 · 0 评论 -
二叉树的前中后序查找(Java日记十二)
思想:在遍历函数上加以修改,设置函数返回值,找到返回1(在原输出位置做相等判断),否则返回0,在递归函数下方做判断,如果返回值为1就让它继续返回1。代码如下:package Tree;public class BTDemo { public static void main(String[] args) { char[] arr=new char[30]; int n=0; for (char i = 'A'; i < 'Z'; i原创 2022-03-31 18:58:12 · 591 阅读 · 0 评论 -
C#实现access数据库的增删改查
数据库连接测试如果失败,不代表代码运行的时候也连不上,如果你用的是64位access,你需要下载:Download Microsoft Access 2010 数据库引擎可再发行程序包 from Official Microsoft Download Center下载完成后测试仍然报错,但是代码运行实际连接成功。代码如下:using System;using System.Data; using System.Data.OleDb;namespace ConsoleAp.原创 2022-04-02 15:51:33 · 2015 阅读 · 0 评论 -
取模与取余
今天学Java的循环链表,发现一个问题就是%的运算,老师一直在说取模取模,我一直在想什么是取模那不是取余吗,于是有了这篇文章。所以老师说的有问题在Java中%是取余。此外,余数在数学中的定义是始终大于等于0的,而对于某些编程语言的取余运算不是按照上面的定义来执行的,因此才会出现余数小于0的情况。先说结论:在C/C++,Java,C#中%是取余,而在python中是取模,为避免出错尽量不使用负数进行运算取余(rem)和取模(mod)在被除数、除数同号时,结果是等同的,异号时不同。异号时取余结果符号原创 2022-03-18 13:08:49 · 1552 阅读 · 0 评论 -
解决全排列问题,以及八皇后代码优化(Java日记Ⅸ)
上一篇中我们讲了八皇后递归的思路,但是代码实在是不堪入目,因为从零到七要试探上千万次,简直无法忍受,而我们也知道八皇后的排列方式就是8!的全排列问题,由此可在上一篇的基础上进行代码优化进一步减少运行次数(但还不是最简方法),由原来的需要判断上千万次减少为40320次虽然还是很多,但对于计算机来说还是可以接受的。代码以及说明如下:import java.util.ArrayList;import java.util.List;public class QueenDemo { publi原创 2022-03-25 15:34:37 · 671 阅读 · 0 评论 -
KMP求解next数组的一些思考(私人思路记录,仅限参考)
这篇文章主要说明我思考许久的一个问题就是下方图片中的while循环为什么不能直接让k归0,而一定要用while循环一点一点让k跳到0.下方两张图片第一张是我最开始自己实现时的代码思路,第二张是官方正确答案,主要分析我自己思路出现的问题,以及我对next数组的一些理解我的写法:(i--和continue可以省略,效果一样,但都是错误的)正确写法: 先说明:上方两种写法在输入的字符串中没有二次及更多次重复包含时结果相同,如字符串"ABCDABCDABCDABCC";当有二次重复包含时我的原创 2022-03-31 23:49:23 · 407 阅读 · 0 评论 -
循环队列中公式的推导,原理,超详解
我这里讲的是空闲单元法,如下图首先规定 :front指向队列第一个元素rear指向队列最后一个元素的下一个位置假设maxsize=10因为循环,需要保证front和rear的值始终在0-9之间循环,由此想到取余即%a%b当a<b时结果为a,a>=0,b>0 ,于是有了下方:rear=rear%maxsizefront=front%maxsize以下所有的操作都是rear和rear%maxsize,front和front%maxsize相互之间的替换原创 2022-03-18 14:50:44 · 3925 阅读 · 0 评论 -
python使用tkinter实现学生信息管理系统(上)
python用tkinter从零开始打造一个属于自己的教学管理系统,详细讲解原创 2022-03-23 18:37:43 · 10961 阅读 · 9 评论 -
插值查找公式推导
首先看二分查找的mid = (high+low)/2,可进行变形mid=low+(high-low)/2。再看插值查找的mid=low+(high-low)*(key-arr[low])/(arr[high]-arr[low])。细看是不是只是用key在整序列中的占比来代替原来固定的1/2呢代码和折半查找一模一样,唯独mid的计算方式发生改变。这样的好处在于,对表长较长,且关键字分分布比较均匀,插值查找算法的平均性能要比折半查找要好的多。但是如果表中关键字分布极端不均匀那么插值查找还不如折半查找原创 2022-03-26 15:21:26 · 757 阅读 · 0 评论 -
反转算法及数组的多部分反转,数组中相邻两段位置的互换(C语言)
算法思想:先将需要反转的数组的那部分分别反转,最后再将整个数组反转,即可实现数组中相邻两段位置的互换。例如:1 2 3 4 5 6 7 我想把1234,和567的位置交换,则先将1234反转为4321,再将567反转为765,得到4 3 2 1 7 6 5 最后将整个数组反转得到5 6 7 1 2 3 4。伪代码如下://这个函数使用的是计数方法从1开始算,主函数中不需要执行此函数,直接执行Change函数即可void Reverse(int arr[],int left,int right原创 2022-02-17 13:27:13 · 2069 阅读 · 0 评论 -
删除带头结点单链表最小值的最高效算法(C语言)
算法思想:比较赋值,指针锁定,影子指针通过计数器实现(一般):int Del_min(Link L) { if (L == NULL || L->next == NULL) { return ERROR; } Link P = L; L = L->next; int min=L->data; int count = 1; int local=1; while (L) { if (min > L->data) { min = L->d原创 2022-02-19 12:12:24 · 2356 阅读 · 0 评论 -
将两个有序顺序表按顺序合并为一个新的有序顺序表(C语言)
算法思想:首先,按顺序不断取下两个两个顺序表较小的结点存入新的顺序表中。然后,哪个表有剩余,就将剩下的部分加到新的顺序表后面。书中答案使用了3个循环,我将他合并成了一个循环来实现,伪代码如下:int Combin_List(SqList L1,SqList L2,SqList*L) { if (L1.Length + L2.Length > MAXSIZE) { return ERROR; } int k = 0, k1 = 0, k2 = 0; while (1) { if原创 2022-02-17 13:03:37 · 5813 阅读 · 1 评论 -
教你如何一步一步写出归并排序,算法详解(C语言)
1.首先写出算法的核心:将两个有序数组合并为一个新数组的算法int Merge_1(int arr[], int len) { int* b = (int*)malloc(len * sizeof(int));//开辟辅助数组空间 int k = 0;//给辅助数组下标一个初始值,让程序不报错 int start1, start2, end1, end2;//暂定start为头end为尾,此时end是能取到的所以下面是小于等于,之后发现可以优化 //算法核心:将两个数组按从小到大合并为一个新数原创 2022-03-16 17:36:04 · 1684 阅读 · 0 评论 -
插入排序,二分版插入排序和希尔排序的差别详解(C语言)
希尔排序只是在插入排序最外层加了一层循环并把插入排序中原本为一的步长改变,只需改变插入排序中与1有关的部分为step即可,但当使用哨兵(arr[0])当作中间变量时需要注意最里层的for循环条件详见代码中。注意代码中的注释,这是一个容易出错的地方普通插入排序:int InsertSort(int arr[],int len) { for (int i = 2; i < len; i++) { if (arr[i] < arr[i - 1]) { arr[0] = ar原创 2022-03-11 13:31:50 · 2590 阅读 · 0 评论 -
二分法查找,以及查找不到将其插入原数组使其仍保持有序(C语言)
下方有图片说明二分法的原理与思想(如果能找到下标(mid)最后直接指向要查找的数,但是找不到时下标(mid)有两种可能位置):以x=7为例:同理x=13时:从上图可以看出 :如果没找到返回的下标mid对应的值的位置有两种可能(离x最近的左边,或离x最近的右边)二分法的代码:int Find_elem(int arr[],int x,int size) { int left=0; int right=size-1; int mid; whi...原创 2022-02-17 20:17:49 · 2386 阅读 · 1 评论 -
矩阵及稀疏数组的相互转换(Java日记一)
初学Java,代码的命名不规范,见谅,另外这只是我的笔记,不想花太多时间浪费在解释说明上。public class hello { public static void main(String[] args) { int[][] ChessArr=new int[11][11]; ChessArr[1][2]=1; ChessArr[2][3]=2; for(int[] row : ChessArr){ .原创 2022-03-18 07:55:01 · 642 阅读 · 0 评论 -
单链表的创建以及基本操作函数详解(C语言)
单链表是带有头结点的单链表,讲解及注释在代码中:#define _CRT_SECURE_NO_WARNINGS#pragma once//防止头文件重复包含#include<stdio.h>#include<string.h>#include<stdlib.h>#define OK 1#define ERROR 0#define ElemType inttypedef struct { ElemType data; struct LNode* n原创 2022-02-18 14:48:39 · 3820 阅读 · 1 评论 -
顺序表的创建以及基本操作函数(C语言)
两种创建方式以及初始化函数都在下方代码中:#define _CRT_SECURE_NO_WARNINGS#pragma once//防止头文件重复包含#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXSIZE 50#define OK 1;#define ERROR 0;typedef int ElemType;typedef struct { ElemType dat原创 2022-02-17 13:35:45 · 2645 阅读 · 0 评论 -
反转单链表的两种最简方法,时间复杂度O(n),空间复杂度O(1)(C语言)
我用的是带有头结点的单链表作为演示。方法一:先看图第一步:段链,在图示位置将链表分成两个,用指针P作为第二段链表表头,并将1中指针域next制空(可以创建临时指针R进入1中)。第二步:在图示位置依次执行插入操作(头插法)第三步:进入循环,PQR三指针如影随形,Q是P的影子,R是Q的影子代码如下:int Reverse_lian(Link L) { Link P=L; P = P->next; Link R = P; P = P->nex...原创 2022-02-19 14:50:37 · 2331 阅读 · 0 评论 -
判断质数的所有方法详解(C语言)
方法,讲解,及注释都在代码中,方法3和4一个思想两种写法,如果帮到你可以给我点个赞吗#define _CRT_SECURE_NO_WARNINGS#pragma once//防止头文件重复包含#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>int main() { //IsPrime_2(12); for (int i = 2; i &l原创 2022-03-09 20:15:14 · 6865 阅读 · 0 评论 -
用递归算法以及循环算法,删除不带头结点的单链表L中所有值为x的结点(C语言)
递归算法:(传入的是二级指针变量)思想:执行删除操作后递归自己当前指针,不执行删除操作时递归自己当前指针的指针域next可以根据下图结合代码加以理解:int Del_elems(Link *L, int e) {//不带头结点 Link p; if ((*L)->data == e) { p = *L; *L = (*L)->next; free(p); Del_elems(L, e);//如果销毁,下次传入的指针是修改后的自己 } else if原创 2022-02-18 20:28:04 · 1814 阅读 · 0 评论 -
scanf给多个变量赋值的小问题
今天我同学问我c语言时遇到一个关于scanf的小问题,在此记录一下;scanf("%d,%d",&a,&b);//两个%之间为逗号的输入scanf("%d %d",&a,&b);//两个%之间为空格的输入两者都能正常使用,只不过在控制台输入时,中间为逗号的输入时也应用逗号作为分割,如输入:5,6中间为空格的输入时也应用空格作为分割,如输入:5 6不按规则则第二个值无法录入造成一些不可预知的bug,要注意,更提醒我们在学习的过程中要格外注意这些小的细节。原创 2022-03-09 14:21:36 · 3047 阅读 · 0 评论 -
快速排序的两种不同写法,有助于提高思维的灵活性
第一种是我自己自创的写法,因为之前完全没有学过快排,所以我自己试着从无到有实现了一下,最开始的代码是思维简单,代码量繁多,后来经过我的重重优化化繁为简后,不负众望的弄出了一种新的写法(网上好像还真没人像我这么写过),新写法的优点只有一个那就是代码量少,最重要的是相比于传统写法,我只用了一个while循环+递归就实现了所有操作,而传统写法使用了3个while循环+递归,当然了因为思想是一样的所以时间复杂度什么的并没有区别,但是我使用了flag信号灯原理解决了代码冗余的问题,灵活运用flag=+-1能够有效解决原创 2022-03-11 21:33:23 · 593 阅读 · 0 评论 -
C语言关于使用void声明函数无法使用的问题,报错为重定义不同的基类型
如上图所示,原因为2019默认声明为int类型,如果是写在一个文件中请重新声明一次(如果有头文件请在头文件中声明)如下图:原创 2022-03-11 13:14:55 · 4354 阅读 · 0 评论 -
时间复杂度为O(n)的无序表去重算法(C语言),计数排序
王道数据结构上有一道思考题,删除无序的顺序表中重复元素,要求时间复杂度为O(n),我的思路是使用时间复杂度为O(n)的排序算法+时间复杂度为O(n)的删除算法结合来解决这道问题。计数排序我使用的排序方法为计数排序,参考:1.8 计数排序 | 菜鸟教程 (runoob.com)算法思想:以空间换时间,以下是我对此算法的理解算法的步骤如下:1.找出待排序的无序表中最大和最小的元素2.统计要排序的无序表中每个值为i的元素出现的次数,存入临时数组arr的第i项(此时arr中数组下标代表元素值,原创 2022-02-17 02:41:32 · 3520 阅读 · 1 评论 -
关于希尔排序的一大坑,与冒泡排序有关千万注意
首先看一下希尔排序的原理:原理图解 :说明:1.首先希尔排序的核心思想与算法是插入排序,虽然看起来想冒泡排序的两两互换,但请注意实际上并不是两两互换它只是像而已,由此产生了一个非常严重的误区,有的人写着写着就把希尔排序的核心算法写成冒泡排序的两两互换了,实际上他的核心应该是按步长抽数,将抽到的数排序(使用插入排序方法)并按顺序塞回原来的位置,图中每一行为一个循环,而不是从左到右每隔几个步长进行两两互换,千万要注意。接下来就给大家举个反例:原文链接排序:希尔排序(算法...原创 2022-03-10 21:29:45 · 1403 阅读 · 1 评论 -
C语言 521猫语表白代码(unicode加密)
用实力告诉她们,谁说我们程序员不懂浪漫,不懂幽默,代码原理很简单,整篇就一个知识点,宏的定义,你也可以改成自己想要说的话,但是我觉得其实没必要改,因为已经表达的很清楚了,运用了我非常喜欢的一段话,这里我就不运行了,保持点神秘感。代码如下:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#define 喵喵喵 main#define 喵喵 int#define 喵 (#define 喵喵呜 )#define 喵喵喵喵 {#de原创 2022-05-21 11:39:11 · 2851 阅读 · 0 评论 -
python图像文字识别(附灰度化二值化和压缩图片)
前言:由于python的图像识别库pytesseract太垃圾的缘故,我使用的是百度的OCR接口,使用之前需要去百度AI注册账号并创建一个接口来给自己调用,创建方法网上一大堆教程自己搜,这篇文章主要是自己备用以后可能会用到,在此记录。使用前先安装:测试图片:返回结果: 代码如下:...原创 2022-06-19 12:58:08 · 1394 阅读 · 0 评论 -
python微信公众号自动化搜题
先看这篇来获取学习通中所有习题:python获取学习同指定课程章节(自己悟),代码注释详细,观赏性强_星空的你的博客-CSDN博客上一篇我们已经获取了学习通中所有的章节练习题,这篇讲解如何进行自动化搜索,一般的搜题方式有两种,一种是在线网站搜题用selenium完成自动化,但是我发现这种方式搜题结果不是特别准确,还有就是用客户端和wx微公众号了,说实话这两种方式相比selenium要复杂的多,倒不是技术有多复杂,而是资源难找,难以学习,就比如操作wx的库itchat,wxpy都凉凉了,所以我现在在用的是原创 2022-05-18 20:45:54 · 1847 阅读 · 2 评论