面试
leoufung
Linux Kernel,Virtualization
展开
-
只出现一次的数字 II -- C语言
需求给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,3,2]输出: 3示例2:输入: [0,1,0,1,0,1,99]输出: 99思路除了想到了hashmap,没有想到其他方法。本来想用 ^ 的方式,但是不知道...原创 2020-03-12 21:04:20 · 364 阅读 · 0 评论 -
数组中数字出现的次数 -- C语言
需求一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例 2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2]限制:...原创 2020-03-10 20:46:52 · 2705 阅读 · 0 评论 -
编辑距离 -- C语言
需求给定两个单词word1 和word2,计算出将word1转换成word2 所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例1:输入: word1 = "horse", word2 = "ros"输出: 3解释:horse -> rorse (将 'h' 替换为 'r')ro...原创 2020-03-10 19:21:55 · 387 阅读 · 0 评论 -
最长公共子序列 -- C语言
需求给定两个字符串text1 和text2,返回这两个字符串的最长公共子序列。一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。...原创 2020-03-09 14:28:11 · 3824 阅读 · 1 评论 -
统计不同回文子字符串 -- C语言
需求给定一个字符串 S,找出 S 中不同的非空回文子序列个数,并返回该数字与 10^9 + 7 的模。通过从 S 中删除 0 个或多个字符来获得子字符序列。如果一个字符序列与它反转后的字符序列一致,那么它是回文字符序列。如果对于某个i,A_i != B_i,那么A_1, A_2, ... 和B_1, B_2, ... 这两个字符序列是不同的。 示例 1:...原创 2020-03-06 12:00:13 · 2534 阅读 · 0 评论 -
最短回文串 -- C语言
需求给定一个字符串s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。示例1:输入:"aacecaaa"输出:"aaacecaaa"示例2:输入:"abcd"输出:"dcbabcd"思路要找到最短的添加内容,就相当于从字符串位置0开始,查找到最长的回文串,最长回文串后面的部...原创 2020-03-04 21:06:54 · 2610 阅读 · 2 评论 -
回文对 -- C语言
需求给定一组唯一的单词,找出所有不同的索引对(i,j),使得列表中的两个单词,words[i]+words[j],可拼接成回文串。示例1:输入:["abcd","dcba","lls","s","sssll"]输出:[[0,1],[1,0],[3,2],[2,4]]解释:可拼接成的回文串为["dcbaabcd","abcddcba",...原创 2020-03-04 17:41:41 · 432 阅读 · 0 评论 -
最长回文子串,中心扩展法 -- C语言
需求给定一个字符串 s,找到 s 中最长的回文子串。你可以假设s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"思路因为是找回文子串,所以使用中心扩展法,中心扩展有两种,一种是以单个字符[i,i]为中心,一个是以双个字符[i, i...原创 2020-03-02 20:01:19 · 465 阅读 · 0 评论 -
回文子串 -- C语言
需求给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。示例 1:输入: "abc"输出: 3解释: 三个回文子串: "a", "b", "c".示例 2:输入: "aaa"输出: 6说明: 6个回文子串: "a", "a", "a", "aa", "aa"...原创 2020-03-02 18:08:11 · 1736 阅读 · 0 评论 -
最长回文子序列 -- C语言
需求给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。示例 1:输入:"bbbab"输出:4一个可能的最长回文子序列为 "bbbb"。示例 2:输入:"cbbd"输出:2一个可能的最长回文子序列为 "bb"。思路状态f[i][j] 表示 s 的第 i 个字符到第 j 个字符组成的子...原创 2020-03-01 00:06:51 · 968 阅读 · 0 评论 -
最长回文子串 -- C语言
需求给定一个字符串 s,找到 s 中最长的回文子串。你可以假设s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"代码实现/* * 需求 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设s 的最大长度为 1...原创 2020-02-29 20:15:23 · 719 阅读 · 0 评论 -
只出现一次的数字 -- C语言
需求给定一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。示例 :输入: [1,2,1,3,2,5]输出: [3,5]知识讲解(这部分转自leetcode,详细理解见代码中的注释)使用异或运算可以帮助我们消除出现两次的数字;我们计算bitmask ^= x,则bitmask留下的就是出现奇数次的...原创 2020-02-29 18:36:20 · 1787 阅读 · 1 评论 -
螺旋打印矩阵 -- C语言
需求给定一个包含m x n个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例1:输入:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例2:输入:[ [1, 2, 3, 4], [5, 6, 7, 8],...原创 2020-02-28 22:31:27 · 1491 阅读 · 0 评论 -
二维数组和二维指针作为函数的参数
不管是在工作上,还是最近在LeetCode上刷题。都错误的认为 二维数组 和 二维指针作为函数的参数时是等价的。这种认知是错误的。究其原因,还是对数组和指针理解的不深入。今天把我的理解做一个总结:假如一个函数的形参是一个二维指针,但是你实参传入的是一个二维数组。那么你就会编译报错。为什么我会错误的认为二维数组作为函数参数的时候等价于二维指针呢?我思考了我为什么会这么想的原因了:一维数组...转载 2020-02-28 22:24:46 · 2915 阅读 · 4 评论 -
GDB调试 打印二维数组
int matrix1[3][3] = {{1,2,3},{4,5,6},{7,8,9}};gdb打印的命令为 p **matrix@3@3原创 2020-02-28 21:46:28 · 2017 阅读 · 0 评论 -
最大子序和 -- C语言
需求描述给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释:连续子数组[4,-1,2,1] 的和最大,为6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解思路1. 分两个循...原创 2020-02-28 16:34:35 · 782 阅读 · 0 评论 -
常见的指针变量定义 -- C语言
常见定义a.一个整型数(An integer) int a;b. 一个指向整型数的指针(A pointer to an integer) int * a;c. 一个指向指针的指针,它指向的指针是指向一个整型数的(A pointer to a pointer to an integer) int ** a;d. 一个有10个整型数的数组(An array o...原创 2020-02-27 20:33:04 · 686 阅读 · 0 评论 -
字符串的替换所有指定的子串 -- C语言
需求用户输入3个字符串,然后把在第一个字符串中出现的所有第 2 个字符串替换成第 3 个字符串,最后输出新的字符串。思路使用strstr逐个寻找子串,然后替换;替换的时候分为几步:1. 将sub后面的内容向前或向前移动(因为replace可能大于sub也可能小于sub,所以可能向前复制或者向后复制),腾出空间2. 把replace拷贝到腾出的空间中。3. 循环指针p移...原创 2020-02-27 16:08:46 · 12037 阅读 · 3 评论 -
找出01字符串中0和1连续出现的最大次数 -- C语言
思路逐个遍历字符串,如果发现0,遍历0之后的子串,查找子串中连续出现0的数字,如果超过原有最大值,更新最大值。如果发现1,做同样处理代码实现int getStrMaxSuccNum(char * str, int * pnum0, int * pnum1){ if(NULL == str){ printf("mystrcat param error\n"); retu...原创 2020-02-27 14:24:28 · 868 阅读 · 0 评论 -
计算中文字符串的长度 -- C语言
思路计算 含有 汉字 的 字符串 的 长度, 汉字 作为 一个 字符 处理; 已知: 汉字编码 为 双 字节, 其中 首 字节< 0, 尾 字节 在 0 ~ 63 以外( 如果 一个 字节 是 − 128 ~ 127)。注意:每个系统实现的编码机制不是很一样,在我的机器上,按照的是centos7,汉子的编码是3个字节,所以发现汉字之后,指针应该从当前位置向后移动三个字节,即 p =...原创 2020-02-27 12:51:42 · 6006 阅读 · 2 评论 -
实现strcat库函数 -- C语言
思路找到第一个字符串'\0'位置p,然后把第二个字符串复制到p开始的位置代码实现char * mystrcat(char * str1, char * str2){ if(NULL == str1 || NULL == str2){ printf("mystrcat param error\n"); return NULL; } int len1 = strle...原创 2020-02-27 12:00:13 · 191 阅读 · 0 评论 -
从字符串里面删除所有指定的字符 -- C语言
思路遍历字符串,发现相同的,就用下一个字符开始的子串向前一个覆盖,记录删除的字符个数k,然后记得在 len - k (最后的一个向后一个位置)的地方标记 '\0'代码实现int strRemoveSpecChar(char * str, const char c){ if(NULL == str){ printf("strRemoveSpecChar param error\n...原创 2020-02-26 20:35:13 · 6200 阅读 · 0 评论 -
排序字符串前半部分 -- C语言
需求对字符串前半部分排序,如果长度是技术,则中间的字符不变代码实现int sortHalfStr(char * str){ if(NULL == str){ printf("strSortSwap param error\n"); return PARAM_ERR; } int len = strlen(str); int i = 0, j = 0, sz...原创 2020-02-26 20:03:23 · 246 阅读 · 0 评论 -
删除指定长度的子字符串 -- C语言
需求描述假设 一个 字符串 "abcdefg", 如 要从 第二个 开始( 索引 为 1), 删除 两个 字符, 则删除 后的 字符串 是" adefg"。代码实现int removeSubString(char * str, int index, int size){ if(NULL == str || index < 0 || size < 0){ pri...原创 2020-02-26 19:20:23 · 824 阅读 · 0 评论 -
字符串的循环右移 -- C语言
代码实现int rightShiftStr(char * str, int n){ if(NULL == str){ printf("addBigInt param error\n"); return PARAM_ERR; } int len = strlen(str); if(n > len){ printf("addBigInt param error2\n"...原创 2020-02-26 19:05:01 · 612 阅读 · 0 评论 -
实现两个超大整数相加 -- C语言
思路从后向前处理,逐个相加,记录进位Carrer;注意到头的结束条件是 str -1,因为字符串的头本身也要处理,结束条件是头前面的一个指针地址;最后如果有更长的一个数字,将其剩下的部分加Carrer,补充到前面。最前面一个处理,C可能为1,我们一般多留一位,如果C为0,那么整个字符串前移一位,结尾提前一位写入'\0'代码实现int addBigInt(char * str1, c...原创 2020-02-26 17:23:55 · 3985 阅读 · 1 评论 -
字符串编码 -- C语言
编码规则Give an implementation of encoding a string which contains less than 20 chars. There threerules:1. replace the alphabetical char in the string with the fourth char behind it, for example, a -&...原创 2020-02-26 14:10:20 · 1098 阅读 · 0 评论 -
字符串中的连续字符统,并将统计数字插入到原有字符串中 -- C语言
题目需要在字符串中插入字符统计的个数。 例如字符串 aaabc, 插入字符个数后变成 aaa3b1c1代码实现int statStr(char * str){ if(NULL == str){ printf("statStr param error\n"); return PARAM_ERR; } int len = strlen(str) + 1; /*加上 ...原创 2020-02-26 12:56:26 · 395 阅读 · 0 评论 -
将一个正整数用十六进制和二进制的字符串输出 -- C语言
思路base 是要转换的基树, n % base 拿到的数就是改进制的最低位,缓存起来;然后通过 n / base 来处理下一位并存入缓存;别忘了在最后加上'\0',缓存中的数字和原来是相反的,所以需要反转过来后复制到结果中,但是注意,复制的长度是 len + 1,因为要复制 '\0'代码实现static char hexMetric[16] = { \ '0', '1', '2'...原创 2020-02-25 20:54:37 · 505 阅读 · 0 评论 -
查找两个字符串中最大公共子串 -- C语言
思路分别遍历两个字符串,一个是外循环,一个是内循环,当内、外循环发现有相同的字符的时候,从当前位置开始匹配common子串,并记录长度,如果长度大于max,则更新最长的公共子串;最后用memcpy将找到的最长公共子串拷贝到返回结果的字符串中,记得最后要加上'\0'代码实现char * commonStr(const char * str1, const char * str2){ ...原创 2020-02-25 19:58:21 · 948 阅读 · 0 评论 -
实现strcmp函数 -- C语言
代码实现int mystrcmp(char * str1, char * str2){ char * p = str1; char * q = str2; int len1 = strlen(str1); int len2 = strlen(str2); if(len1 > len2){ return -1; } else if (len1 < len2){...原创 2020-02-25 18:16:25 · 368 阅读 · 0 评论 -
判断是否是回文串 -- C语言
思路首尾对着遍历字符串,发现不相等就返回false代码实现bool isPalindromeStr(char * str){ if(NULL == str){ printf("isPalindromeStr param error!\n"); return false; } bool flag = true; char * head = str; char *...原创 2020-02-25 16:50:22 · 283 阅读 · 0 评论 -
反转字符串,但指定的子串不翻转 -- C语言
原理首先把整个字符串反转过来,然后用查找子串的函数找到子串,再翻转回来代码实现char * mystrstr(char * str, char * sub){ if(NULL == str || NULL == sub){ printf("mystrstr param error\n"); return NULL; } char * p = NULL, * q = N...原创 2020-02-25 15:16:44 · 395 阅读 · 0 评论 -
整个字符串反转 -- C语言
思路找到字符串头和尾,整个互换位置代码实现int strReverse(char * head, char * tail){ if(NULL == head || NULL == tail){ printf("strReverse param error!\n"); return PARAM_ERR; } char tmp; while(head < ta...原创 2020-02-25 14:48:54 · 178 阅读 · 0 评论 -
字符串各单词的反转 -- C语言
思路我们首先把字符串整个反转,然后在逐个单词反转回来,每个单词通过空格' '分隔开代码实现int strReverse(char * head, char * tail){ if(NULL == head || NULL == tail){ printf("strReverse param error!\n"); return PARAM_ERR; } ch...原创 2020-02-25 14:29:00 · 1430 阅读 · 0 评论 -
字符串中子串的查找 -- C语言
思路使用两个循环,外循环遍历主串,内循环遍历查找串,主串一个字符一个字符的后移,分别和查找串进行批评,找到了就返回代码实现char * mystrstr(char * str, char * sub){ if(NULL == str || NULL == sub){ printf("mystrstr param error\n"); return NULL; }...原创 2020-02-24 20:25:05 · 5785 阅读 · 0 评论 -
计算字符串长度 -- C语言
代码实现int mystrlen(char * str){ if(NULL == str){ printf("mystrcpy param error\n"); return 0; } char * c = NULL; int len = 0; c = str; while(*c++ != '\0'){ len++; } return len;}voi...原创 2020-02-24 19:30:04 · 471 阅读 · 0 评论 -
实现memcpy函数 -- C语言
思路这个函数的实现很简单,只要将原内存中的数据逐个复制到目标内存中,使用char进行复制步长最简单,当然,你也可以按照其他长度复制内容。内存是连续的,没有结束,所以不要用 NULL判断,应该用size做判断。注意编程规范和出入参校验。返回值用void * 是为了链式编程使用。废话不多说了,看代码。代码实现void * mymemcpy(void * dst, void * src, ...原创 2020-02-24 18:32:49 · 406 阅读 · 0 评论 -
实现strcpy函数 -- C语言
代码实现int mystrcpy(char * dst, char * src){ if(NULL == dst || NULL == src){ printf("mystrcpy param error\n"); return PARAM_ERR; } char * p = NULL, * q = NULL; p = dst; q = src; while(*q...原创 2020-02-24 18:05:32 · 309 阅读 · 0 评论 -
利用客户函数将字符串转换为数字 -- C语言
思路C/ C++ 提供 了 几个 标准 库 函数, 可以 将 字符串 转换 为 任意 类型( 整型、 长整型、 浮点 型 等) 的 数字。下面 列举 了 各 函数 的 方法 及其 说明。atof(): 将 字符串 转换 为 双 精度 浮点 型 值。atoi(): 将 字符串 转换 为 整型 值。atol(): 将 字符串 转换 为 长整型 值。strtod(): 将 字符串...原创 2020-02-24 17:10:10 · 174 阅读 · 0 评论