C/C++学习之C提高-----非空格的字符串长度、去掉字符串前后空格、字符串反转、键值对字符串、const练习、二级指针做输入/输出的特性、将字符串按逗号分开,并放入二维数组打印出来
来源:互联网 发布:类似ostagram的软件 编辑:程序博客网 时间:2024/06/05 08:55
1.求非空格的字符串长度
- 要求:某一字符串两边为空格,求非空格字符串长度
- 如:char *p = ” abdcefg “;
(1)代码
方法一
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>void main(){ //求非空格的字符串长度 char *p = " abdcefg "; int i, j = 0; i = 0; j = strlen(p) - 1; int ncount = 0; while (isspace(p[i]) && p[i] != '\0') { i++; } while (isspace(p[j]) && p[j] != '\0') { j--; } ncount = j - i + 1; printf("ncount:%d", ncount); system("pause"); return;}
方法二
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>//求非空格的字符串长度void getCount(char *str, int *pCount){ char *p = str; int ncount = 0; int i, j = 0; if (str == NULL || pCount == NULL) { return -1; } i = 0; j = strlen(p) - 1; while (isspace(p[i]) && p[i] != '\0') { i++; } while (isspace(p[j]) && p[j] != '\0') { j--; } ncount = j - i + 1; *pCount = ncount;}void main(){ char *p = " abcdefg "; int count = 0; getCount(p, &count); printf("count:%d\n", count); system("pause"); return;}
(2)运行结果
(3)图解
2.去掉字符串前后空格
(1)代码
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>//去掉字符串前后空格void trimSpace(char *str, char *newstr){ char *p = str; int ncount = 0; int i, j = 0; if (str == NULL || newstr == NULL) { printf("func trimSpace() \n"); return -1; } i = 0; j = strlen(p) - 1; while (isspace(p[i]) && p[i] != '\0') { i++; } while (isspace(p[j]) && p[j] != '\0') { j--; } ncount = j - i + 1; strncpy(newstr, str + i, ncount); newstr[ncount] = '\0';}void main(){ char *p = " abcdefg "; char buf[1024] = { 0 }; trimSpace(p, buf); printf("p:%s\n", p); printf("buf:%s\n", buf); system("pause"); return;}
(2)运行结果
3.字符串反转
(1)方法一
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>void main(){ char buf[] = "abcdefg"; int length = strlen(buf); char *p1 = buf; char *p2 = buf + length - 1; while (p1 < p2) { char c = *p1; *p1 = *p2; *p2 = c; ++p1; --p2; } printf("buf:%s\n",buf); system("pause"); return;}
(2)方法二:通过递归的方式,逆向打印
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>//通过递归的方式,逆向打印void inverse(char *p){ if (p == NULL)//递归结束的异常条件 { return; } if (*p == '\0')//递归结果条件 { return; } inverse02(p + 1);//注意此时没有执行打印,而是执行了调用函数 //让字符串的每一个地址入栈 printf("%c", *p);}void main(){ char buf[] = "abcdefg"; inverse(buf); system("pause");}
(3)方法三:递归和全局变量(把逆序的结果存入全局变量)
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>char g_buf[1024];void inverse(char *p){ if (p == NULL)//递归结束的异常条件 { return; } if (*p == '\0')//递归结果条件 { return; } inverse(p + 1);//注意此时没用执行打印,而是执行了调用函数 //让字符串的每一个地址入栈 strncat(g_buf, p, 1);}void main(){ char buf[] = "abcde"; memset(g_buf, 0, sizeof(g_buf)); inverse(buf); printf("g_buf:%s\n",g_buf); system("pause"); return;}
(4)方法四:递归和非全局变量(递归指针做函数参数)
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>void inverse(char *p, char *bufresult){ if (p == NULL)//递归结束的异常条件 { return; } if (*p == '\0')//递归结果条件 { return; } inverse(p + 1, bufresult);//注意此时没用执行打印,而是执行了调用函数 //让字符串的每一个地址入栈 strncat(bufresult, p, 1);}void main(){ char buf[] = "abcde"; { char mybuf[1024] = { 0 }; inverse(buf,mybuf); printf("递归和局部变量在一起mybuf:%s\n", mybuf); } system("pause");}
4.键值对字符串
- 要求1:求自己定义一个接口,实现根据key获取value
- 要求2:编写测试用例
- 要求3:键值对中间可能有n多个空格,求去除空格
如:
"key1= value1";"key2= value2 ";"key3=value3 ";"key4= value4";...
代码
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>/*===================================== 键值对字符串在开发中经常使用 要求1:求自己定义一个接口,实现根据key获取value 要求2:编写测试用例 要求3: 键值对中间可能有n多个空格,求去除空格===========================================*///去掉字符串前后空格int trimSpace1(char *str, char *newstr){ char *p = str; int ncount = 0; int i, j = 0; if (str == NULL || newstr == NULL) { printf("func trimSpace() \n"); return -1; } i = 0; j = strlen(p) - 1; while (isspace(p[i]) && p[i] != '\0') { i++; } while (isspace(p[j]) && p[j] != '\0') { j--; } ncount = j - i + 1; strncpy(newstr, str + i, ncount); newstr[ncount] = '\0'; return 0;}//根据key获取valueint getValueByKey(char *keyvaluebuf,char *keybuf,char *valuebuf){ char *p = NULL; int ret = 0; if (keyvaluebuf == NULL || keybuf == NULL || valuebuf == NULL) { return -1; } //1.查找key是不是在母串中 p = keyvaluebuf; p = strstr(p, keybuf); if (p == NULL) { return -1; } //让辅助指针变量 重新达到下一次检索的条件 p = p + strlen(keybuf); //2.看有没有=号 p = strstr(p, "="); if (p == NULL) { return -1; } //让辅助指针变量 重新达到下一次检索的条件 p = p + strlen("="); //3.在等号后面 去除空格 ret = trimSpace1(p, valuebuf); if (ret != 0) { printf("func trimSpace1() err:%d \n",ret); return ret; } return 0;}int main(){ int ret = 0; int buf[1024]; char *keyandvalue = "key2= value2 "; char *key = "key2"; ret = getValueByKey(keyandvalue,key,buf); if (ret != 0) { printf("func getKeyByValue() err:%d \n",ret); return ret; } printf("buf:%s\n",buf); system("pause"); return ret;}
运行结果
5.const小专题
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>void getmem1(const char *p){ p = 1; p = 3; //p[1]='a'; 报错 return;}void getmem2(char *const p){ //p = 1;报错 //p = 3;报错 p[1]='a'; return;}void getmem3(const char *const p){ //p = 1;报错 //p = 3;报错 //p[1] = 'a'; printf("%c", p[1]); return;}void main01(){ char *p1 = NULL; const char *p2 = NULL; p2 = 1; printf("hello...\n"); system("pause"); return;}void main(){ const int a = 10; //a = 11; { int *p = &a; *p = 100; printf("a:%d \n", a); //结论:C语言中的const修饰的变量是假的,C语言中的const是一个冒牌货 } printf("hello...\n"); system("pause"); return;}
结论
- 指针变量和它所指向的内存空间变量,是两个不同的概念
- 看const是放在*左边还是右边,看const是修饰指针变量,还是修饰所指向的内存空间变量
6.二级指针做输出的特性
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>//指针做输出:被调用函数分配内存int getMem(char **myp1, int *mylen1, char **myp2, int *mylen2){ char *tmp1 = NULL; char *tmp2 = NULL; tmp1 = (char *)malloc(100); if (tmp1 == NULL) { return -1; } strcpy(tmp1, "abcdefg"); *mylen1 = strlen(tmp1); *myp1 = tmp1; //间接修改实参p1的值 tmp2 = (char *)malloc(100); if (tmp2 == NULL) { return -2; } strcpy(tmp2, "11122233333"); *mylen2 = strlen(tmp2); *myp2 = tmp2; //间接修改实参p1的值 return 0;}int getMem_Free(char **myp1){ /* if (myp1 == NULL) { return ; } free(*myp1); //释放完指针变量 所致的内存空间 *myp1 = NULL; //把实参修改成nULL */ char *tmp = NULL; if (myp1 == NULL) { return -1; } tmp = *myp1; free(tmp); //释放完指针变量 所致的内存空间 *myp1 = NULL; //把实参修改成nULL return 0;}void main(){ char *p1 = NULL; int len1 = 0; char *p2 = NULL; int len2 = 0; int ret = 0; ret = getMem(&p1, &len1, &p2, &len2); printf("p1: %s \n", p1); printf("p2: %s \n", p2); getMem_Free(&p1); getMem_Free(&p2); printf("p1: %s \n", p1); printf("p2: %s \n", p2); system("pause"); return;}
7.二级指针做输入的特性
(1)第一种模型(指针数组排序、打印)
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>//打印void printMyArray(char **myArray, int num){ int i = 0; for (i = 0; i < num; i++) { //printf("%s \n", myArray[i]); printf("%s \n", *(myArray + i)); }}//排序void sortMyArray(char **myArray, int num){ int i = 0, j = 0; char *tmp = NULL; //排序 for (i = 0; i < num; i++) { for (j = i; j<num; j++) { if (strcmp(myArray[i], myArray[j]) > 0) { tmp = myArray[i]; //注意 交换的是数组元素 交换的是指针的值 //改变指针的指向 myArray[i] = myArray[j]; myArray[j] = tmp; } } }}void main(){ int i = 0, j = 0; int num = 0; char *tmp = NULL; //数组 数组中的每一个元素是指针 指针数组 char *myArray[] = { "aaaaaa", "ccccc", "bbbbbb", "111111" }; //打印 num = sizeof(myArray) / sizeof(myArray[0]); printf("排序之前\n"); printMyArray(myArray, num); sortMyArray(myArray, num); //排序 printf("排序之后\n"); printMyArray(myArray, num); printf("hello...\n"); system("pause"); return;}
(2)第二种模型(二维数组排序、打印)
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>void printMyArray(char myArray[10][30], int num){ int i = 0; for (i = 0; i < num; i++) { //printf("%s \n", myArray[i]); printf("%s \n", *(myArray + i)); // }}//交换的是内存块void sortMyArray(char myArray[10][30], int num){ int i, j = 0; char tmpBuf[30]; for (i = 0; i < num; i++) { for (j = i + 1; j<num; j++) { if (strcmp(myArray[i], myArray[j]) > 0) { strcpy(tmpBuf, myArray[i]); //交换的是内存块 strcpy(myArray[i], myArray[j]); strcpy(myArray[j], tmpBuf); } } }}void main(){ int i = 0, j = 0; int num = 4; char myBuf[30]; char tmpBuf[30]; char myArray[10][30] = { "aaaaaa", "ccccc", "bbbbbbb", "1111111111111" }; //打印 printf("排序之前\n"); printMyArray(myArray, num); sortMyArray(myArray, num); //打印 printf("排序之后\n"); printMyArray(myArray, num); printf("hello...\n"); system("pause"); return;}
(3)第三种模型(手工二维内存)
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>void main(){ int i = 0, j = 0; char **p2 = NULL; int num = 5; char *tmp = NULL; char tmpbuf[100]; p2 = (char **)malloc(sizeof(char *)* num); for (i = 0; i < num; i++) { p2[i] = (char *)malloc(sizeof(char)* 100); //char buf[100]; sprintf(p2[i], "%d%d%d", i + 1, i + 1, i + 1); } //排序之前 printf("排序之前\n"); for (i = 0; i < num; i++) { printf("%s \n", p2[i]); } //排序 交换的是指针指向 /* for (i=0; i<num; i++) { for (j=i+1; j<num; j++) { if (strcmp( p2[i] , p2[j]) < 0) { tmp = p2[i]; p2[i] = p2[j]; p2[j] = tmp; } } } */ //排序 交换的是内存的值 for (i=0; i<num; i++) { for (j=i+1; j<num; j++) { if (strcmp( p2[i] , p2[j]) < 0) { strcpy(tmpbuf, p2[i]); strcpy( p2[i], p2[j]); strcpy( p2[j], tmpbuf); } } } //排序之后 printf("排序之后\n"); for (i = 0; i < num; i++) { printf("%s \n", p2[i]); } //释放内存 for (i = 0; i < num; i++) { if (p2[i] != NULL) { free(p2[i]); p2[i] = NULL; } } if (p2 != NULL) { free(p2); } printf("hello...\n"); system("pause"); return;}
代码优化(封装函数)
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>char **getMem11(int num){ int i = 0; char **p2 = NULL; p2 = (char **)malloc(sizeof(char *)* num); if (p2 == NULL) { return NULL; } for (i = 0; i < num; i++) { p2[i] = (char *)malloc(sizeof(char)* 100); //char buf[100]; sprintf(p2[i], "%d%d%d", i + 1, i + 1, i + 1); } return p2;}void printMyArray(char **myArray, int num){ int i = 0; for (i = 0; i < num; i++) { //printf("%s \n", myArray[i]); printf("%s \n", *(myArray + i)); }}void sortMyArray(char **myArray, int num){ int i = 0, j = 0; char *tmp = NULL; //排序 for (i = 0; i < num; i++) { for (j = i; j<num; j++) { if (strcmp(myArray[i], myArray[j]) <0) { tmp = myArray[i]; myArray[i] = myArray[j]; myArray[j] = tmp; } } }}void getMem11_Free(char **p2, int num){ int i = 0; //释放内存 for (i = 0; i < num; i++) { if (p2[i] != NULL) { free(p2[i]); p2[i] = NULL; } } if (p2 != NULL) { free(p2); }}void main(){ int i = 0, j = 0; char **p2 = NULL; int num = 5; char *tmp = NULL; char tmpbuf[100]; p2 = getMem11(num); //排序之前 printf("排序之前\n"); printMyArray(p2, num); sortMyArray(p2, num); //排序 交换的是内存 //排序之后 printf("排序之后\n"); printMyArray(p2, num); //释放内存 getMem11_Free(p2, num); //p2是一个野指针 printf("hello...\n"); system("pause"); return;}
(4)三种模型的内存图
void main(){ int i = 0; //指针数组 char * p1[] = {"123", "456", "789"}; //二维数组 char p2[3][4] = {"123", "456", "789"}; //手工二维内存 char **p3 = (char **)malloc(3 * sizeof(char *)); //int array[3]; for (i=0; i<3; i++) { p3[i] = (char *)malloc(10*sizeof(char)); //char buf[10] sprintf(p3[i], "%d%d%d", i, i, i); }}
8.将字符串按逗号分开,并放入二维数组打印出来
- 如:char *p1 = “aaaa,bbbb,cccc,dddd,1111,2222,”;
方法一
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>int spitString(const char *buf1, char c, char buf2[10][30], int *count){ char *p = NULL, *pTmp = NULL; int tmpcount = 0; //1 p和ptmp初始化 p = buf1; pTmp = buf1; do { //2 检索符合条件的位置 p后移 形成差值 挖字符串 p = strchr(p, c); if (p != NULL) { if (p - pTmp > 0) { strncpy(buf2[tmpcount], pTmp, p - pTmp); buf2[tmpcount][p - pTmp] = '\0'; //把第一行数据变成 C风格字符串 tmpcount++; //3重新 让p和ptmp达到下一次检索的条件 pTmp = p = p + 1; } } else { break; } } while (*p != '\0'); *count = tmpcount; return 0;}void main(){ int ret = 0, i = 0; char *p1 = "aaaa,bbbb,cccc,dddd,1111,2222,"; char cTem = ','; int nCount; char myArray[10][30]; ret = spitString(p1, cTem, myArray, &nCount); if (ret != 0) { printf("fucn spitString() err: %d \n", ret); return ret; } for (i = 0; i < nCount; i++) { printf("%s \n", myArray[i]); } printf("hello...\n"); system("pause"); return;}
方法二
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>//有一个字符串符合以下特征"dasd,saddasd,gfgfgg,aaaa,fwfsadqw,sssss,";//分清楚赋值指针变量 和 操作逻辑之间的关系int spitString(const char *buf1, char c, char **myp /*in*/, int *count){ char *p=NULL, *pTmp = NULL; int tmpcount = 0; //1 p和ptmp初始化 p = buf1; pTmp = buf1; do { //2 检索符合条件的位置 p后移 形成差值 挖字符串 p = strchr(p, c); if (p != NULL) { if (p-pTmp > 0) { strncpy(myp[tmpcount], pTmp, p-pTmp); myp[tmpcount][p-pTmp] = '\0'; //把第一行数据变成 C风格字符串 tmpcount ++; //3重新 让p和ptmp达到下一次检索的条件 pTmp = p = p + 1; } } else { break; } } while (*p!='\0'); *count = tmpcount; return 0;}void main(){ int ret = 0, i = 0; char *p1 = "dasd,saddasd,gfgfgg,aaaa,fwfsadqw,sssss,"; char cTem= ','; int nCount; char **p = NULL; //相当于char buf[10][30] p = (char **)malloc(10 * sizeof(char *)); // char * array[10] if (p == NULL) { return; } for (i=0; i<10; i++) { p[i] = (char *)malloc(30 * sizeof(char)); } ret = spitString(p1, cTem, p, &nCount); if (ret != 0) { printf("fucn spitString() err: %d \n", ret); return ret; } for (i=0; i<nCount; i++ ) { printf("%s \n", p[i]); } //释放内存 for (i=0; i<10; i++) { free(p[i]); } free(p); printf("hello...\n"); system("pause"); return ;}
方法三
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>char ** spitString(const char *buf1, char c, int *count){ char *p = NULL, *pTmp = NULL; int tmpcount = 0; char **myp = NULL; //1 p和ptmp初始化 p = buf1; pTmp = buf1; //第一遍求出count do { //2 检索符合条件的位置 p后移 形成差值 挖字符串 p = strchr(p, c); if (p != NULL) { if (p - pTmp > 0) { tmpcount++; //3重新 让p和ptmp达到下一次检索的条件 pTmp = p = p + 1; } } else { break; } } while (*p != '\0'); *count = tmpcount; //根据多少行 精确的分配内存 myp = (char **)malloc(tmpcount * sizeof(char *)); if (myp == NULL) { return NULL; } tmpcount = 0; //1 p和ptmp初始化 p = buf1; pTmp = buf1; do { //2 检索符合条件的位置 p后移 形成差值 挖字符串 p = strchr(p, c); if (p != NULL) { if (p - pTmp > 0) { int len = p - pTmp + 1; myp[tmpcount] = (char *)malloc(len * sizeof(char)); if (myp[tmpcount] == NULL) { return NULL; } strncpy(myp[tmpcount], pTmp, p - pTmp); myp[tmpcount][p - pTmp] = '\0'; tmpcount++; //3重新 让p和ptmp达到下一次检索的条件 pTmp = p = p + 1; } } else { break; } } while (*p != '\0'); return myp;}void main(){ int ret = 0, i = 0; char *p1 = "abcdef,acccd,sdasdd,dsfdffds,eqwwqew,dasdsd,"; char cTem = ','; int nCount; char **p = NULL; //char buf[10][30] p = spitString(p1, cTem, &nCount); if (p == NULL) { printf("fucn spitString() err: %d \n", ret); return ret; } for (i = 0; i < nCount; i++) { printf("%s \n", p[i]); } //释放内存 for (i = 0; i < nCount; i++) { free(p[i]); } free(p); printf("hello...\n"); system("pause"); return;}
优化代码
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>void FreeMem(char ***p, int count){ int i = 0; char **myp = NULL; if (p == NULL) { return; } myp = *p; if (myp == NULL) { return; } for (i = 0; i < count; i++) { if (myp[i] != NULL) { free(myp[i]); } } if (myp != NULL) { free(myp); } *p = NULL; //把实参二级指针 ,修改成NULL}int spitString(const char *buf1, char c, char ***myp3, int *count){ int ret = 0; char *p = NULL, *pTmp = NULL; int tmpcount = 0; char **myp = NULL; //1 p和ptmp初始化 p = buf1; pTmp = buf1; //第一遍求出count do { //2 检索符合条件的位置 p后移 形成差值 挖字符串 p = strchr(p, c); if (p != NULL) { if (p - pTmp > 0) { tmpcount++; //3重新 让p和ptmp达到下一次检索的条件 pTmp = p = p + 1; } } else { break; } } while (*p != '\0'); *count = tmpcount; //根据多少行 精确的分配内存 myp = (char **)malloc(tmpcount * sizeof(char *)); if (myp == NULL) { ret = -1; printf("func spitString4() err:%d (tmpcount * sizeof(char *) )", ret); goto END; //return -1; } memset(myp, 0, tmpcount * sizeof(char *)); /*============================================================*/ tmpcount = 0; //1 p和ptmp初始化 p = buf1; pTmp = buf1; do { //2 检索符合条件的位置 p后移 形成差值 挖字符串 p = strchr(p, c); if (p != NULL) { if (p - pTmp > 0) { int len = p - pTmp + 1; myp[tmpcount] = (char *)malloc(len * sizeof(char)); if (myp[tmpcount] == NULL) { ret = -2; printf("func spitString4() err:%d malloc(len * sizeof(char) )", ret); goto END; } strncpy(myp[tmpcount], pTmp, p - pTmp); myp[tmpcount][p - pTmp] = '\0'; //把第一行数据变成 C风格字符串 tmpcount++; //3重新 让p和ptmp达到下一次检索的条件 pTmp = p = p + 1; } } else { break; } } while (*p != '\0');END: if (ret != 0) //失败 { FreeMem(&myp, *count); } else { *myp3 = myp; //成功 } return ret;}void main(){ int ret = 0, i = 0; char *p1 = "abcdef,acccd,"; char cTem = ','; int nCount; char **p = NULL; //char buf[10][30] ret = spitString(p1, cTem, &p, &nCount); if (ret != 0) { printf("fucn spitString() err: %d \n", ret); return ret; } for (i = 0; i < nCount; i++) { printf("%s \n", p[i]); } //释放内存 for (i = 0; i < nCount; i++) { free(p[i]); } free(p); printf("hello...\n"); system("pause"); return;}
阅读全文
0 0
- C/C++学习之C提高-----非空格的字符串长度、去掉字符串前后空格、字符串反转、键值对字符串、const练习、二级指针做输入/输出的特性、将字符串按逗号分开,并放入二维数组打印出来
- 求非空格字符串的长度,并打印字符串
- C语言除去字符串前后的空格
- 去掉字符串前后的空格
- c 去除字符串前后空格
- C语言去掉字符串前后空格,中间多余空格
- C语言输入带空格的字符串
- C++ && C 带空格的字符串输入
- C语言输入带空格的字符串
- C和指针之二维字符串数组用指针数组、数组指针、二级指针打印
- 去掉前后字符串空格
- objective-C 中类似于C#中trim的方法(去掉字符串前后空格)
- JavaScript去掉字符串的前后空格
- 去掉Perl中字符串前后的空格
- JAVA去掉一个字符串的前后空格
- 去掉字符串的空格、前后字符
- 在objective-c中去掉字符串前后空格的方法
- C语言中常用的字符串操作(子串分割、替换、去前后空格、递归实现字符串反转)
- #49 图形输出3 心得体会
- C++——【USACO 5.4.3】——Telecowmunication
- 方程求解
- N皇后算法—优化版
- include静态包含和动态包含
- C/C++学习之C提高-----非空格的字符串长度、去掉字符串前后空格、字符串反转、键值对字符串、const练习、二级指针做输入/输出的特性、将字符串按逗号分开,并放入二维数组打印出来
- 自学机器学习---一条你可能缺少的路线图
- 动态规划进阶
- 【BZOJ2744】【二分图】[HEOI2012]朋友圈 题解
- 十月小结,过去的一个月内,我收获了什么?
- 一致性哈希算法(consistent hashing)
- 初学Qt:QCheckBox
- Linux下使用unzip命令解压war包
- LeetCode 49 Group_Anagrams Java实现