鉴于跟着学校已经囫囵吞枣的敲过不少代码;自己从指针这天开始跟着英雄哥给的题目刷
知识点回顾
名词 | 简介 |
---|---|
指针 | 变量的地址 |
取地址 | 变量->地址 |
解引用 | 地址->变量 |
数组首地址 | 用数组名表示 |
范式 | 规范的写法 |
1、重新排列数组
题目描述:
‘代码片’:
/*C语言*/
int* shuffle(int* nums, int numsSize, int n, int* returnSize){
int i;
int *ret = (int*)malloc(sizeof(int)*numsSize);
for(i=0;i<numsSize;i++){
if(i&1){
ret[i]=nums[n+i/2];
}
else{
ret[i]=nums[(i+1)/2];
}
}
* returnSize = numsSize;
return ret;
}
不明白的点:
- i&1 不知道对应的知识点,只知道能够区分奇偶
2、数组串联:
题目描述:
实现代码:
int* getConcatenation(int* nums, int numsSize, int* returnSize){
int *ans = (int*)malloc(sizeof(int)*numsSize*2);
for(int i=0;i<numsSize;i++){
ans[i]=ans[numsSize+i]=nums[i]; //(1)
}
*returnSize = 2*numsSize;
return ans;
}
之前没试过的写法:
ans[i]=ans[numsSize+i]=nums[i]; //(1)
3、基于排列构建数组
题目描述:
代码实现:
int* buildArray(int* nums, int numsSize, int* returnSize){
int * ans=(int*)malloc(sizeof(int)*numsSize);
for(int i=0;i<numsSize;i++){
ans[i]=nums[nums[i]];
}
*returnSize=numsSize;
return ans;
}
- 感觉这里比较有趣,数组中有多少个元素对应的下标就有多少个对应自然数存入内存
4、一维数组的动态和
题目描述;前缀和
实现代码:
int* runningSum(int* nums, int numsSize, int* returnSize){
int *ret = (int*)malloc(sizeof(int)*numsSize);
for(int i=0;i<numsSize;i++){
ret[i]=nums[i];
if(i){
ret[i]+=ret[i-1];
}
}
*returnSize=numsSize;
return ret;
}
- 到这里,朋友们就能感觉到这里都用了一样的结构
int *func(int *nums, int numsSize, int *returnSize{
int *ret = (int *)malloc( sizeof(int) * xxx);
// to do;
* returnSize = xxx;
* return ret;
- 其实自己觉得这是今天学到的精华;
5、左旋转字符串
题目描述:
代码实现
char* reverseLeftWords(char* s, int n){
int len = strlen(s);
char *ret =(char*)malloc(sizeof(char)*(len+1));
for(int i =0;i<len;i++){
ret[i]=s[(i+n)%len];
}
ret[len]='\0';
return ret;
}
- 这道题创建了一个字符数组指针,值得注意的是,新字符数组结尾加上 ‘\0’ ,以便调用函数方确定字符数组长度。
6、IP地址无效化
题目描述;
实现代码;
char * defangIPaddr(char * address){
char * ret = (char*)malloc(sizeof(char)*1000);
int returnSize = 0;
for(int i=0;address[i];i++){
if(address[i]=='.'){
ret[returnSize++]='[';
ret[returnSize++]='.';
ret[returnSize++]=']';
}
else{
ret[returnSize++]=address[i];
}
}
ret[returnSize]='\0';
return ret;
}
- 自己题解出错在returnSize的设置。
7、替换空格
题目描述;
实现代码:
char* replaceSpace(char* s){
int n = strlen(s);
int returnSize=0;
char *ret=(char*)malloc(sizeof(char)*(n+1)*3);
for(int i =0;i<n;i++){
if(s[i]==' '){
ret[returnSize++]='%';
ret[returnSize++]='2';
ret[returnSize++]='0';
}
else{
ret[returnSize++]=s[i];
}
}
ret[returnSize++]='\0';
return ret;
}
- 上一题自己打出来后,这一道题也很快就出来了,没有出错。
总结
知识点是前一天中外音乐史课上看的,其实连看了三天的内容,但是觉得自己能敲出来才是算实践