C/C++
文章平均质量分 90
小可爱amour
magic_coder_sun,一个可爱的小绿博主
展开
-
关于malloc和mmap的相关细节
预备知识1:size_t 类型 为了增强程序的可移植性,有了size_t,不同系统上,定义size_t不一样。 经测试发现,32位系统中size_t是4字节,64位系统中,size_t是8字节,这样利用该类型可以增加程序移植性。 size_t一般用来表示一种计数,比如有多少东西被拷贝等。例如:sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建立的最大对象的字节大小。 它的意义大致是“适于计量内存中可容纳的数据项目个数的无符号整数类型”。所以,它在数组下标和...原创 2020-08-14 19:07:47 · 1360 阅读 · 1 评论 -
realloc() 用法详解
原型:extern void *realloc(void *mem_address, unsigned int newsize);语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。 //新的大小若小于原来的大小,原数据的末尾可能丢失(被其他使用内存的数据覆盖等)头文件:#include <stdlib.h> 有些编译器需要#include <malloc.h>,在TC2.0中可以使用alloc.h头文件功能:先判断当前的指针是否...转载 2020-08-27 17:02:11 · 27802 阅读 · 4 评论 -
面试题 17.14. 最小K个数 347. 前 K 个高频元素
面试题 17.14. 最小K个数题目设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。示例:输入: arr = [1,3,5,7,2,4,6,8], k = 4输出: [1,2,3,4]提示:0 <= len(arr) <= 1000000 <= k <= min(100000, len(arr))class Solution {public: vector<int> smallestK(vector<i原创 2020-09-11 15:36:55 · 162 阅读 · 1 评论 -
printf的实现原理
要了解变参函数的实现,首先我们的弄清楚几个问题:1: 该函数有几个参数。2: 该函数怎样去访问这些参数。3: 在访问完成后,如何从堆栈中释放这些参数。函数变参 对于c语言,它的调用规则遵循_cdedl调用规则。 在_cdedl规则中: 1. 参数从右到左依次入栈2. 调用者负责清理堆栈3. 参数的数量类型不会导致编译阶段的错误 printf的声明: int _cdecl printf(const char* for...原创 2020-09-07 18:25:32 · 2745 阅读 · 1 评论 -
剑指面试题05. 替换空格
注:leetcode上的此题需要另辟空间,不是像剑指书上那样是原地修改,所以字符串从第一个或最后一个字符移动对时间复杂度没有影响,有点脱离此题的本意。char* replaceSpace(char* s){ if (s == NULL) return NULL; int blank_num = 0, len = 0; char *ptr = s; while (*ptr != '\0') { if (*ptr == ' ')原创 2020-06-04 20:36:40 · 128 阅读 · 0 评论 -
剑指面试题12. 矩阵中的路径 (原地修改和创建额外数组两种解法)
解法1:创建额外数组记录访问与否bool findRecu(char** board, int rows, int cols, int row, int col, char* word, bool* visited) { if (*word == '\0') //不可以和下一个if调换顺序 return true; if (row < 0 || row >= rows || col < 0 || col >原创 2020-06-09 21:31:16 · 135 阅读 · 0 评论 -
剑指面试题16. 数值的整数次方 (两种解法的对比和常见坑讲解)
解法1:避坑写法double powRcu(double base, int exponent) { if (exponent == 0) return 1.0; //必须有 if (exponent == 1) return base; double res = powRcu(base, exponent/2); //奇数偶数除以2的值一样 res *= res; if (exponent%2) res *= base; re原创 2020-06-11 20:10:07 · 235 阅读 · 0 评论 -
剑指面试题30. 包含min函数的栈 (构造数据结构和每次压栈两次两种解法)
解法1:构造合适的数据结构 根据题意,构造合适的数据结构,一个Data是一个栈元素,其中val是当前栈的数值元素,prim_min记录的是当前栈之前所有数值元素的最小值,若需要知道当前元素的最小值,只需要求得min(val, prim_min)即可。 构造数据结构时,用时需要仔细区分->和.来正确访问元素。#define N 10000#define Min(x,y) ((x)<(y)?(x):(y))typedef struct { ...原创 2020-06-15 12:42:17 · 77 阅读 · 0 评论 -
剑指面试题32. 从上到下打印二叉树系列 (算法详细图解和STL队列/双向队列实现)
题目1:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。1.1 思路解析 为了更好地讲解从上到下打印二叉树系列的题目,我们所选的二叉树示例如图1所示。 图1:二叉树示例 根据题意,我们需要一个一边压入节点一边输出节点的容器,也就是可以选择队列或者双向队列。这里...原创 2020-06-18 18:18:51 · 197 阅读 · 0 评论 -
231. 2的幂 338. 比特位计数 342. 4的幂 易错点解析
解法1:若是2的幂,则二进制只有一位1class Solution {public: bool isPowerOfTwo(int n) { if (n == 0) return false; long x = n; return (x&(x-1)) == 0; }};注:1:== 的优先级比 &(按位与)高,一定不要写成return n&(n-1) == 0; 会让你怀疑人生..原创 2020-06-28 20:51:07 · 218 阅读 · 0 评论 -
165. 比较版本号 三种解法
解法1:不调用任何方法,赤手择数字,比较每节版本号的字符串class Solution {private: //得到每节版本号的有效起始地址[left, right) bool getNumIndex(string s, int len, int& left, int& right) { if (left >= len) //已无有效版本号原创 2020-06-29 20:57:06 · 294 阅读 · 0 评论 -
151. 翻转字符串里的单词 ( 三种实现)
题目要点:1:字符串首尾都有可能存在多余的空格2:字符串中间单词之间又可能存在连续多个空格解法1:从字符串手择单词,放到一个缓存数组里class Solution {private: //传入字符串的左下标,确定单词的有效左右下标,右下标指向单词的下一位 bool getWord(const string& s, int len, int& left, int& right) { while (left < len &原创 2020-06-30 13:10:18 · 4283 阅读 · 0 评论 -
125. 验证回文串 (两边切和一边切)
题目:给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。解法1:处理双指针,直至都遇到数字字母class Solution {public: bool isPalindrome(string s) { int len = s.length(); if (len < 2) return true; int left = 0,原创 2020-07-02 19:09:18 · 73 阅读 · 0 评论 -
memset,memcpy,memmove和memchr
1:memset原型:void *memset(void *s, int ch, size_t n);头文件:<memory.h>功能:按字节将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。其他:1.1:对较大的结构体和数组进行清零操作的一种最快方法。一般malloc后结合使用,给内存赋值 1.2:memset函数按字节对内存块进行初始化,所以不能用它将int数组初始化为0和-1之外的...原创 2020-07-16 17:05:23 · 611 阅读 · 0 评论 -
strnlen,strlcpy,strlcat,snprintf,memncpy等函数对比和学习
从头文件、函数声明、函数功能和其他说明等角度对以下函数进行对比和学习。1:strnlen<string.h>size_t strnlen(const char *str, size_t maxlen);计算字符串str的(unsigned int型)长度,直到碰到第一个字符串结束符'\0'或计数至maxlen为止,然后返回长度。不包括结束符'\0',该长度最大为maxlen。1.1 strlenstring.h(C)或cstring(C+...原创 2020-07-20 21:07:06 · 1658 阅读 · 0 评论 -
不定参数处理 va_list和vsnprintf
在对常用宏 带小练习的掌握基础上,研究一下变参函数的参数处理。1:va_list及相关宏定义 va_list表示可变参数列表类型,指向参数的指针。//获取类型占用的空间长度,最小占用长度为int的整数倍#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )//获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是可变参数最左边的参数)#de...原创 2020-07-23 14:42:36 · 296 阅读 · 0 评论 -
常用宏(#,##和可变宏) 带小练习
1.1:#在宏体中,如果宏参数前加个#,那么在宏体扩展的时候,宏参数会被直接被扩展成字符串的形式,而不在乎宏参数在上文中的值。1.2:## ##是个粘合剂,先分隔,然后进行强制连接。当两边参数有变量时,将前后两部分粘合起来,“组成变量名”;若两边参数都是常数,则输出粘合的常数结果。 若两边都是字符串,会报“does not give a valid preprocessing token”错:关于g++报错这两行:cout<<NUM("1","2",...原创 2020-07-23 12:06:45 · 273 阅读 · 0 评论 -
C/C++ 之 原子操作
1:i++ 对于i++这样的操作,其实是分3步执行的,读取i的值,增加i的值,回写i的新值。这3步每一步都是原子操作,但是组合在一起就不一定是原子操作了。可以参看下图中两个线程对i的争抢示例。我们期待线程A与B中的i++可以顺序执行,最终存储器中的结果是2;但是实际上由于两个线程并行执行,结果可能得到1(当然也有可能得到2,运气好的话)。通常i++这样的操作我们称为“读-改-写”操作。1.1:Lock指令 由于的确有业务逻辑要求多线程中类似于i++这样的“读-改-写”操作...原创 2020-07-22 18:11:04 · 1378 阅读 · 0 评论