九日集训(第四天)指针

鉴于跟着学校已经囫囵吞枣的敲过不少代码;自己从指针这天开始跟着英雄哥给的题目刷

知识点回顾

名词简介
指针变量的地址
取地址变量->地址
解引用地址->变量
数组首地址用数组名表示
范式规范的写法

1、重新排列数组

题目描述:
leetcode

‘代码片’:

/*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、数组串联:

题目描述:leetcode1929

实现代码:

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、基于排列构建数组

题目描述:leetcode1920

代码实现:

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、一维数组的动态和

题目描述;前缀和leetcode1480

实现代码:

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、左旋转字符串

题目描述:剑指offer

代码实现

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地址无效化

题目描述;leetcode1108

实现代码;

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、替换空格

题目描述;
剑指offer05

实现代码:

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;
}
  • 上一题自己打出来后,这一道题也很快就出来了,没有出错。

总结

知识点是前一天中外音乐史课上看的,其实连看了三天的内容,但是觉得自己能敲出来才是算实践

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值