自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 【golang】interface{} nil问题

之所以会这样,是因为interface{} 类型的变量存储了两个部分:一个是类型信息,一个是具体的值。当将一个 nil 的 []int 切片赋给一个 interface{} 类型的变量时,虽然切片的值是 nil,但它的类型信息仍然存在。因此,这个 interface{} 类型的变量本身并不会是 nil。要判断一个 interface{} 是否真正是 nil,它的类型信息部分和值部分都必须是 nil。如上代码,正常工作会解析出int 切片的内容然后打印。可以看到,跳过了 i==nil的判断,继续往下执行;

2025-01-26 20:43:05 163

原创 【gorm】gorm中count方法与mysql中count方法的不同

但是在与group语句结合使用时,gorm的count方法统计的是组的总个数,而mysql的count是先分组,再对每个组分开计算数量。在 Count 操作时,ORM 通常会忽略 DISTINCT 的影响,因为在 SQL 中,COUNT(*) 是对所有行进行计数,而不考虑去重。但是我想,如果在mysql里用group和count结合,mysql不会返回组的个数,而是会对每个组分开计数。这样就和gorm有出入了。查出来的结果发现,对于需要去重的table1内的内容,统计的Count并非去重后的,还是全量。

2024-11-28 18:23:33 373 1

原创 json: cannot unmarshal string into Go value of type xxx

这种方法应该是想着传入的类型是原始类型的数据,这样先序列化再反序列化就能忽略原始类型的影响。但是传入的是已经序列化的[]byte就不可以了。问题还是主要出在如果对[]byte类型的数据进行序列化,会生成字符类型的乱码。这里在testJSON序列化json时,先将参数序列化为jsonScore,再将其反序列化回原始值。这样可能想的是忽略接口原始传入的值类型,正常序列化。但是debug时发现,进入该函数时已经将原始值当做了 []uint8 类型。今天在工作时,遇到了一个json序列化问题。

2024-09-27 18:33:30 779

原创 【Go语言】遍历用string初始化的any切片时报错

问题描述:将几个字符串传入空接口切片,并将空接口切片重新传入一个空接口内,在使用时,把这个空接口断言为string切片使用,触发了panic。虽然编译器已经知道里面的成员为string类型,可是你仍然不能直接将其断言为string切片。正确处理方法:将空接口断言为空接口切片,并在遍历时依次断言为string,如下所示。很明显,即使你是以string初始化的,但他还是any类型。debug也显示如此。很基础的错误,可以说学习过程中涨涨经验了~今天工作时发现如下问题,遂记录下来。这样一来,便可以成功运行了。

2024-08-13 21:51:54 223

原创 unordered_map尝试引用已删除的函数

后来上网查找资料发现,unordered_map不仅要重载==,还要重载一个能映射其地址的函数。想来也是,因为底层是哈希表,要给个仿函数也不过分。今天在做题时候,把unordered_map的键值设定为自定义的结构体,发生了一系列报错。map同理,但只需要重载

2023-08-19 21:24:04 1146

原创 负载均衡式OJ系统结项总结

项目分为三个模块,分别为:Comm模块:公用模块,其内包含一些复用性强的代码,供其他模块使用,包括文件操作、字符串处理、网络请求等功能。Compiler_server模块:编译并运行模块,当用户提交代码到服务器上时,要在服务器上形成临时文件,编译并运行,得到运行结果。OnlineJudge模块:能调用编译运行模块并访问文件或数据库,把题目列表、编辑界面返回给用户,并可以负载均衡的选择服务器宏观结构。

2023-08-01 19:53:54 404 2

原创 Boost库搜索引擎结项总结

我们在给用户返回时,要返回的是一个html文件的内容。

2023-03-15 21:37:10 480 2

原创 【C语言数据结构】排序问题

本文中我们介绍几种常见的排序方式。这里以递增为例。1.直接插入排序首先说思路:我们假设要将一个数字插入一个有序数组。我们先用这个数字与数组的最右端的元素(最大值)相比较,如果这个元素比他大,那么就将这个最大值向右移动一个单位,并用次大值再与这个数字比较,以此类推。直到这个数字比当前的元素大,那么就用这个数字插在原有的两个元素之间。因为这个元素的下一位已经移动,所以不用担心元素覆盖数据丢失。但是如果走到头也没有比他小的元素时,就要把他放在第一位,充当新有序数组的最小值。void InsertSort(

2021-11-19 13:06:57 2623 7

原创 【C语言数据结构】堆排序

给定一个有n个数据的数组,将其排列为升序或者降序。//这里是向上向下排序的函数代码//向下排序void AdjustDown(int* a, int n, int parent){ assert(a); int child = parent * 2 + 1; while (child < n) { if (child + 1 < n && a[child] < a[child + 1]) child++; if (a[child] > a

2021-11-07 16:31:57 697 1

原创 【C语言数据结构】利用堆解决Topk问题

Topk问题:给定你一个数组a,内有n个元素,请问怎么可以找出他前k个最大/最小的数?这个题我们可以利用堆的特性来解决。我们可以先创建一个大小为k的小堆(如果求前k个最小的数就创建大堆,这里以求前k个最大的数为例),并对其排序。此时排在堆顶的就是当前堆内最小的数。下一步我们将剩余n-k个数依次与堆顶元素比较,如果这个数比堆顶元素大,那么将堆顶元素删除并将这个数入堆,否则就检查下一个数。如此下来到最后,堆内剩下的元素就是所有数里最大的k个数了。/*这里是笔者实现的堆 void AdjustDown(i

2021-11-04 22:29:42 748 1

原创 【C语言数据结构】数据结构环形单链表练习题

我们可以定义一个快指针一个慢指针,快指针一次走两步,慢指针一次走一步。快指针一定会比慢指针先进入循环,那么当慢指针进入循环时,就相当于快指针开始“追击”慢指针。假设此时他们的距离为N,那么每走一次,他们的距离就会缩短1,最后一定会遇到一起。附:为什么快指针一次走2步而不是更多?我们用3步做一个例子。假设他们的差距为N,那么一次会缩短2,如果N为偶数,那么可以追到;但是如果N为奇数,最后的距离会变成1,再走一步,快指针越过了慢指针来到了他的下一位,此时他们的差距变成了C-1(C为循环圈的大小)。而如果C-1

2021-10-24 20:14:49 187

原创 【C语言】最少多少步可以变为斐波那契数

题目:给你一个N,想让其变成一个Ficonacci数,每一步可以进行+1,-1操作,求最少需要多少步可以变为Ficonacci数?首先要实现这个题目,就先要实现斐波那契数列的函数和判断一个数是否为斐波那契数的函数。我们都知道斐波那契数列如何实现,在此也不做赘述。如何判断一个数是否为斐波那契数呢?如果一个数是斐波那契数,直接返回1判断他是;如果他不是,那么我们知道他肯定会夹在两个斐波那契数之间,我们只需要利用这点就可以轻松解决。#define _CRT_SECURE_NO_WARNINGS 1#inc

2021-10-17 12:10:25 350

原创 【C语言】类似的两道双指针练习题

1.给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。思路:首先用一个变量记录下数组元素,然后可以用两个指针(其实是两个整形,抽象为指针)分别指向数组首元素,快指针前进,每遇到一个元素判断一次这个元素是否等于val。如果这个元素不等于val,就直接把他覆盖在慢指针指向的元素,并且覆盖后移动慢指针;如

2021-10-13 19:17:31 160

原创 【C语言】关于宏的练习

1.写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。思路:我们可以把一个数二进制的偶数位和奇数位分别存储下来,然后把偶数位向右移动一位,奇数位向左移动一位,然后二者按位或,这样便完成了交换。如何分别存储奇数和偶数位?存储奇数位:可以用原数先按位与一个01010101 01010101 01010101 01010101(十进制为1431655765)这样一来,原数的奇数位如果为1结果就是1,如果为0结果就是0,而他的偶数位在与0的同时全部变成了0,这样一来他的奇数位便存储了下来。而偶数

2021-10-09 15:57:44 433 1

原创 【C语言】库函数atoi模拟实现

#include <stdio.h>#include <string.h>int my_atoi(char* arr){ int m = 0; int flag = 3; if (arr == NULL) return 0; //如果arr是null,直接返回0 while (*arr == ' ') { arr++; //此举目的为跳到第一个非空字符处 } if (*arr == '-') {

2021-09-23 20:32:20 254 1

原创 【C语言】找单身狗(一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 编写一个函数找出这两个只出现一次的数字。)

思路:首先将数组遍历,把所有数组成员依次异或一遍。我们知道,异或操作符操作的是二进制位,相同为0,相异为1,所以两个相同的数异或之后结果为1。所以所有元素遍历异或后,得到的其实是两个“单身狗”异或操作之后的结果。然后,我们找到这个结果在第几位是为1(两个“单身狗”在第几个二进制位产生了不同)并把这个位数保存下来。之后再遍历一次数组,并且把这些数字依次右移,右移长度为之前保存的位数,再将结果与1进行按位与操作。由于相同的数字得到的结果肯定相同,并且两个“单身狗”在这一位是不同的,所以肯定能保证两个“单身狗”被

2021-09-23 19:31:54 354 3

原创 【C语言】把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

这个题第一次看到的时候,首先想到的是一个一个列出数字,依次判断是不是丑数并且累计次数。#include <stdio.h>int Isuglynumber(int i){ if (i == 2 || i == 3 || i == 5) return 1; else { int j = i; while (1) { if (j % 2 == 0) j

2021-08-29 18:43:24 3967 2

原创 【C语言】求一个有序数组中两个元素值相加为k的数字,返回这两个元素的下标。要求时间复杂度是O(n),空间复杂度O(1)

做这个题,我们的思路是用两个指针,一个指向数组第一个元素,一个指向数组最后一个元素。因为数组是有序的,所以如果最右边的元素大于我们要找的和,直接将右指针向左移一个单位就可以。#include <stdio.h>int main(){ int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int x = 0; scanf("%d", &x); int* p = arr; int* left = arr; int* right = arr + 9

2021-08-18 23:40:50 276

原创 【C语言】在字符串中找出第一个只出现一次的字符。如输入 “abaccdeff“ ,则输出 ‘b‘ 。要求时间复杂度为 O(n) 。

由于题目所给出的限制,无法用循环嵌套。#include <stdio.h>int main(){ char arr[] = "abaccdef"; int arr1[200] = { 0 };//创建一个数组,用于计算每个元素出现的个数 char* p = arr; while (*p)//这层循环用于计算每个元素出现的个数 { arr1[*p]++;/*注意:这里直接用arr内的字符对应的ASCLL码值作为 存储于arr1内的元素下标。当数组中出现重复字符时,直接就可以

2021-08-15 21:22:56 428 1

原创 【C语言】输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的 最大值。要求时间复杂度为O(n)。

在做这个题的时候,首先想到的是循环嵌套,以数组的每个元素为首元素,并依次计算和,并将和储存,最后求最大值。int main(){ int arr[8] = { 1,-2,3,10,-4,7,2,-5 }; int arr1[100] = { 0 }; int count = 0; int i = 0, j = 0; for (i = 0; i < 8; i++) { arr1[count] = 0; count++; for (j = 0; j < 8 - i; j+

2021-08-15 11:43:05 1910 3

原创 ## 浮点型数据在内存中的存储

浮点型数据在内存中的存储首先引一段代码,来引入今天的内容。`#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <assert.h>int main(){ int a = 9; float* p = (float*)&a; printf("%d\n", a); printf("%f\n", *p); *p = 9.0; printf("%d\n",

2021-08-09 20:49:42 199 2

原创 函数栈帧的创建与销毁

首先介绍几个概念。

2021-08-08 23:40:12 520 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除