c语言
Go 鹏ya
这个作者很懒,什么都没留下…
展开
-
【C++刷题笔记】回溯-组合startIndex问题
我举过例子,如果是一个集合来求组合的话,就需要startIndex,例如:77.组合 (opens new window),216.组合总和III (opens new window)。如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:17.电话号码的字母组合。原创 2023-02-25 10:17:19 · 113 阅读 · 0 评论 -
【C++刷题笔记】动态规划-背包:一维滚动数组 组合排列技巧
如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for循环遍历物品。原创 2023-02-21 16:05:06 · 76 阅读 · 0 评论 -
【C语言小知识点笔记】多个变量被一个代码段(常量区)赋值,其地址指向是一样的
常量字符串在常量区,不能被修改,没必要保存多份原创 2022-01-19 12:00:31 · 325 阅读 · 0 评论 -
【leetcode做题练习】动态规划的两个trick
leetcode中很多动态规划的背包问题;其中关于求解决什么问题有多少种方案又分为 排列问题(考虑顺序)和组合问题(不考虑顺序)。关于这两种问题,在进行遍历时有两个小技巧帮助解题,具体逻辑原因请参考以下的github:https://github.com/youngyangyang04/leetcode-master1. 组合问题不考虑顺序:先遍历物品后遍历背包。假设求n个1和n个5装满空间6的背包,先考虑有1的情况,完了在此基础上再考虑有5的情况,就只会出现{1、5},不会出现{5、1}。2. 排原创 2021-08-21 11:34:43 · 95 阅读 · 0 评论 -
【C语言进阶学习笔记】四、结构体内存对齐、位段
一、结构体内存对齐分析如下代码:struct s{ char a; int b; char c;};两个char类型加上一个int类型一共6个字节?但是事实却是:这是因为存在结构体内存对齐,指每个变量所占空间的起始处是有规定的,跟对齐数有关。对齐数:每个变量的对齐数是编译器默认的对齐数与其所占内存大小的较小值。首先结构体第一个变量所占内存的起始处我们假设为相对偏移量为0。其余变量计算自己的对齐数,将自己所占内存的起始处从对齐数的整数倍处开始存放。结构体所占内存总原创 2021-08-18 13:52:33 · 115 阅读 · 3 评论 -
【C语言进阶学习笔记】三、C语言内置的字符串操作(1)
1、求字符串长度strlensize_t strlen(const char * str)注意:1、strlen的是返回不包括字符串中的\0的字符个数;2、内置strlen的返回值类型是size_t,因此类似于strlen("abc") - strlen("acbdf") > 0这样的代码要注意,因为无符号类型肯定都大于0。strlen的模拟实现如下:int my_strlen(char* str) { int count = 0; while (*str) { count++原创 2021-08-16 15:35:23 · 149 阅读 · 0 评论 -
【C语言进阶学习笔记】二、指针进阶
目录1、字符指针2、指针数组3、数组指针4、数组传参和指针传参5、函数指针6、函数指针数组7、指向函数指针数组的指针8、回调函数指针可以理解为一个变量,里面存放着地址,可以通过解引用来访问该地址上存储的数据。指针是有类型的,指针的类型决定着一个指针在+1或者-1时跳过多少个字节;和指针解引用时能访问的内存的大小。1、字符指针字符指针中存储着一个地址,该地址的内存块上存储着一个字符;字符指针用char*表示。一般例如:int main(){ char ch = 'x'; cha原创 2021-08-15 20:52:02 · 147 阅读 · 6 评论 -
【C++做题练习】复制带随机指针的链表(力扣No.138)
Leetcode 138题解题https://leetcode-cn.com/problems/copy-list-with-random-pointer/给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。返回复制链表的头节点。解题思路:/** * Definition for a Node. * struct Node { * int val; * struct Node *原创 2021-08-03 18:13:43 · 167 阅读 · 0 评论 -
【leetcode做题练习】链表带环问题看这一篇就够了!(力扣No.141)
带环链表问题环形链表I解题分析示例面试提问环形链表II环形链表I解题分析示例https://leetcode-cn.com/problems/linked-list-cycle/description/问题:给定一个链表,判断链表中是否有环。思路:方法1:此问题是链表中的经典问题,用的也是经典方法:快慢针;这也是南京邮电大学2021年计算机考研811数据结构算法题的第一题,别问我怎么知道的,问就是本人考过呜呜。方法2:其实如果不算空间复杂度和时间复杂度,是可以用一个很长的数组存起来走过的每一个结原创 2021-08-02 21:11:00 · 153 阅读 · 0 评论 -
【C/C++算法练习题】1、交换一个数二进制的奇偶位
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。1、要交换奇数位和偶数位,只需要将奇数位全部提取出来向左移动一位2、要交换偶数位和奇数位,只需要将偶数位全部提取出来向右移动一位3、再将上述两步的结果合并1、如何提取奇数位奇数位一般在第1、3、5 … 29、31上设计一个序列在这几个位上为1,其他位上为0,然后相与,可得出原始的奇数位上的数字,而偶数位上都是0如10的二进制为10: 00000000 00000000 00000000 00001010提取器:010原创 2021-07-24 20:25:36 · 422 阅读 · 0 评论 -
C语言预处理、编译、链接
目录1、 预处理2、编译3、链接1、 预处理预处理:相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有头文件(都已经被展开了)、宏定义(都已经替换了),没有条件编译指令(该屏蔽的都屏蔽掉了),没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。2、编译编译:将预处理完的文件逐一进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。编译是针对单个文件编译的,只校验本文件的语法是否有问题,不负责寻找实体。3、链接链接:通过链接器原创 2021-07-24 19:56:59 · 362 阅读 · 0 评论 -
include “x.h“与include <x.h>的区别
1、 < >引用的是编译器的类库路径里面的头文件2、 " "引用的是你程序目录的相对路径中的头文件,在程序目录的相对路径中找不到该头文件时会继续在类库路径里搜寻该头文件。类库可以理解为是编译器自定义的头文件故: 引用系统自带时一般用<>;引用自己定义的时一般用"";但是""包含<>的功能。...原创 2021-07-22 09:18:06 · 190 阅读 · 0 评论 -
动态内存之常见错误
常见错误1、对NULL指针解引用2、对动态开辟的空间越界访问3、对非动态开辟的空间使用free4、使用free释放动态开辟的内存区域的一部分5、对同一块动态开辟的内存释放多次6、内存泄漏(忘记释放)1、对NULL指针解引用void test(){ int *p = NULL; *p = 20; //p在创建时就没有分配内存空间,这会儿让它存放个20,它往哪儿放呢 return 0;}2、对动态开辟的空间越界访问void test(){ int *p = (int*)malloc(siz原创 2021-07-20 12:30:30 · 128 阅读 · 0 评论 -
C语言之找两个单身狗
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。找出一个只出现过一次的数字的问题处理方法就是找一个数字把里面所有的数字都异或一遍,利用异或两次等于没异或的特点来处理。那么如果有两个数字都只出现了一次,那么如此得到的应该是两个数异或的结果。首先这个结果肯定不是0(要不然就全都配对了),所以里面一定至少一位是一。找出值为1的一位,以这一位的值将结果分为两组。例如1 2 3 4 1 2,异或完的结果应该是3^4得到的111,那么随便找一位就行了。例如找最低原创 2021-07-20 10:27:40 · 186 阅读 · 0 评论 -
动态内存之malloc、calloc、realloc
动态内存分配1、 内存分区2、C中三种动态开辟内存方式malloccallocrealloc1、 内存分区内存分为栈区、堆区、静态区(数据段),其中:栈区:局部变量、函数的形参堆区:动态分配的静态区:全局变量、静态变量2、C中三种动态开辟内存方式mallocvoid* malloc(size_t size);向内存申请一片连续空间,开辟成功了返回一个指向开辟空间的指针,不成功则返回一个NULL//example#include "stdio.h"#include "stdlib.h原创 2021-07-19 09:15:49 · 119 阅读 · 0 评论 -
字符指针、指针数组、数组指针、二级指针传参、函数指针、函数指针数组、指向函数指针数组的指针、回调函数
指针汇总字符指针指针数组数组指针二级指针传参函数指针字符指针#include "stdio.h"int main(){ char* ptr = "hello bit"; return 0;}这里并不是把"hello bit"整个字符串传给指针ptr,指针ptr只是只想字符串首字母"h"的地址#include "stdio.h"int main(){ char str1[] = "hello"; char str2[] = "hello"; char *原创 2021-06-07 22:44:18 · 86 阅读 · 0 评论 -
数据的存储(大小端、浮点数存储754标准)
· 整数正数原、反、补相同;负数最高位为符号位;反码为符号位不变,其余位取反;补码为反码加1负数补码除符号位外其余按位取反,再+1,得到原码。这个过程与原码得到补码一样大小端大端存储:数据的低位存放在高地址中;如低8位存放的地址比高8位存放的地址高,即高8位先存再存低8位。小端存储:数据的低位存放在内存地址的低位。可以通过如下代码判断自己的电脑的存储模式#include "stdio.h"int check(){ int a = 1; char *p = (char *)&a原创 2021-05-24 00:54:18 · 596 阅读 · 0 评论 -
【C/C++算法练习题】2、字符串倒置(一道曾经腾讯面试题)
字符串倒置(腾讯笔试题)将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I#include "stdio.h"#include "string.h"//方法1,使用双指针//void reverse(char arr[], int left, int right){// while (left < right){// char temp = arr[left];// arr[left原创 2021-05-21 18:15:41 · 59 阅读 · 0 评论 -
有关sizeof返回无符号整型的一个很坑的题目
#include <stdio.h>int i;int main(){ i--; if (i > sizeof(i)) { printf(">\n"); } else { printf("<\n"); } return 0; }按道理来说i为初始化默认为0;–后为-1;而i为整形其大小为4个字节;-1<4;应该选A但是由于sizeof返回的无符号类型,也会把左边的原创 2021-05-12 12:11:19 · 210 阅读 · 0 评论 -
整形提升
运算过程中,若参与运算的数没有达到一个int类型4个字节大小,就会在运算过程中发生整形提升。有符号位的按符号位提升;char a = -1;//11111111 - 补码//整形提升://11111111 11111111 111111111 111111111没有符号位的补0#include "stdio.h"int main(){ char a = 3; //000000000 000000000 000000000 00000011 //a : 0000000原创 2021-05-11 18:50:32 · 49 阅读 · 0 评论 -
1、左移右移; 2、面试题:不创建其他变量,实现两个数交换;3、单目操作符sizeof;4、360面试题;5、逗号表达式
操作符1、左移右移左移:左边抛弃,右边补0右移:(1)逻辑移位:左边用0填充,右边丢弃(2)算术移位:左边用原来该值的符号填充,右边丢弃。正数的原码,反码,补码一样;负数反码为原码符号位不变,其他按位取反;补码为反码+1int num = 10;int b = num >> 1;//num本身的值不会变2、面试题:不创建其他变量,实现两个数交换//方法1;会出现a+b太大导致溢出#include "stdio.h"int main(){ int a = 10;原创 2021-05-11 13:10:48 · 78 阅读 · 0 评论 -
C语言小项目 之 三子棋
test.c 主函数//test.c#include "game.h"void menu(){ printf("***************************\n"); printf("******** 1. play *****\n"); printf("******** 0. exit *****\n"); printf("***************************\n");}void game(){ ch原创 2021-04-24 12:10:52 · 76 阅读 · 0 评论 -
C语言二维数组
二维数组初始化int arr[3][4] = {1,2,3,4}int arr[3][4] = {{1,2},{3,4}}int arr[ ][4] = {{2,3}, {4,5}}二维数组在内存中是连续存放的1.每行元素内是连续的2.各行之间也是连续存放的数组名是什么·数组名是数组首元素的地址(有两个列外)sizeof(arr) //数组名表示整个数组,计算的是整个数组的长度&arr //此时数组名表示整个数组,取出的是整个数组的地址3中数组地址表达方式区别&原创 2021-04-24 12:01:08 · 191 阅读 · 0 评论 -
C语言递归
递归的两个必要条件1.不能死递归,要有跳出条件,且每次递归要逼近跳出条件2.递归层次不能太深,不然会出现栈溢出满足条件1,不满足条件2的情况void test(int n){ if (n < 10000) { test(n + 1); }}int main(){ int a = 10; test(1); return 0;}递归的常见题目1.求n的阶乘#include "stdio.h"#include "string.h"//使用递归int f原创 2021-04-20 12:36:12 · 95 阅读 · 1 评论 -
VS中scanf的办法
4月1日比特学习VS中scanf_s问题的解决方法在vs中,vs的编译器认为scanf是不安全的,它自己提供了一个scanf_s的函数。但是这个函数仅仅在vs里面能用,在别的编译器像clion中就用不起来;因此可以在最上面第一行用一句解决。#define _CRT_SECURE_NO_WARNINGS 1更改模版使得不用每次都手动添加在我们vs的文件夹里搜索newc++file.cpp文件;将上面那段代码贴进去,以后创建的新文件就可以直接在上面附带一行#define _CRT_SECURE_NO原创 2021-04-01 16:30:52 · 5280 阅读 · 0 评论 -
C语言中的goto
gotoc语言中提供了可以随意滥用的goto语句和标记跳转的标号;这些跳转也只能在一个函数程序中使用goto的基本用法示例#include "stdio.h"int main(){ int count = 0; flag: printf("hehe\n"); printf("haha\n"); goto flag; return 0;}goto的实际的应用场景终止程序的深度嵌套结构处理过程#include "stdio原创 2021-04-13 21:08:05 · 240 阅读 · 1 评论 -
C语言关键字,重点static,define,定义宏
关键字1.typedeftypedef理解为重命名typedef unsigned int uint_32int main(){ unsigned int num1=0; uint_32 num2=0; return 0; //num1和num2的类型是一样的}2.staticstatic是用来修饰变量和函数的修饰局部变量-静态局部变量2.修饰全局变量-静态全局变量3.修饰函数-静态函数1.修饰布局变量static修饰局部变量,第一次执行初始化,出函数后没有销毁,原创 2021-04-08 19:56:39 · 355 阅读 · 0 评论