九日集训第四天(指针)

一、前言

九日集训第四天

二、题目

1)1470. 重新排列数组

  给你一个数组 n u m s nums nums ,数组中有 2 n 2n 2n 个元素,按 [ x 1 , x 2 , . . . , x n , y 1 , y 2 , . . . , y n ] [x1,x2,...,xn,y1,y2,...,yn] [x1,x2,...,xn,y1,y2,...,yn]的格式排列。请你将数组按 [ x 1 , y 1 , x 2 , y 2 , . . . , x n , y n ] [x1,y1,x2,y2,...,xn,yn] [x1,y1,x2,y2,...,xn,yn] 格式重新排列,返回重排后的数组。

1.a)题目分析:

  本题在C语言中可以使用指针来解题,同时Java由于没有指针,可以直接遍历数组,重新排序即可。

1.b)代码:

   C C 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[(1+i)/2];
        }
    }
     *returnSize = numsSize;
      return ret;
}

   j a v a java java代码

class Solution {
    public int[] shuffle(int[] nums, int n) {
        int len = nums.length;
        int[] res = new int[len];
        for(int i=0,k=i+n,j=0;j<n;i+=2,k++,j++){
            res[i]=nums[j];
            res[i+1]=nums[k];
        }
        return res;
    }
}

2)1929. 数组串联

给你一个长度为 n n n 的整数数组 n u m s nums nums 。请你构建一个长度为 2 n 2n 2n 的答案数组 a n s ans ans ,数组下标 从 0 0 0 开始计数 ,对于所有 0 < = i < n 0 <= i < n 0<=i<n i i i ,满足下述所有要求:
   ans[i] == nums[i]
   ans[i + n] == nums[i]
具体而言, a n s ans ans 由两个 n u m s nums nums 数组 串联 形成。返回数组 a n s ans ans

2.a)题目分析:

  C语言思想本题与上题同理,Java则可以用取余计算。

2.b)代码:

   C C C代码

int* getConcatenation(int* nums, int numsSize, int* returnSize){
    int i;
    int *ret =(int *)malloc(2*numsSize*sizeof(int));
    for(i=0;i<numsSize;i++){
        ret[i+numsSize]=ret[i]=nums[i];
    }
    *returnSize =2*numsSize;
    return ret;
}

   j a v a java java代码

class Solution {
    public int[] getConcatenation(int[] nums) {
        int n =nums.length;
        int []ans = new int[2*n];
        for(int i =0;i<2*n;i++){
            ans[i]=nums[i%n];
        }
        return ans;
    }
}

3)1920. 基于排列构建数组

  给你一个 从 0 0 0 开始的排列 n u m s nums nums(下标也从 0 0 0 开始)。请你构建一个 同样长度 的数组 a n s ans ans ,其中,对于每个 i i i ( 0 < = i < n u m s . l e n g t h ) (0 <= i < nums.length) 0<=i<nums.length,都满足 a n s [ i ] = n u m s [ n u m s [ i ] ] ans[i] = nums[nums[i]] ans[i]=nums[nums[i]] 。返回构建好的数组 a n s ans ans 。从 0 0 0 开始的排列 n u m s nums nums 是一个由 0 0 0 n u m s . l e n g t h − 1 nums.length - 1 nums.length1 0 0 0 n u m s . l e n g t h − 1 nums.length - 1 nums.length1 也包含在内)的不同整数组成的数组。

3.a)题目分析:

  C语言还是用指针来解决问题,Java则可以遍历数组。

3.b)代码:

   C C C代码

int* buildArray(int* nums, int numsSize, int* returnSize){
    int i;
    int *ans= (int *)malloc (numsSize*sizeof(int));
    for(i=0;i<numsSize;i++){
        ans[i]=nums[nums[i]];
    }
    *returnSize=numsSize;
    return ans;
}

   j a v a java java代码

class Solution {
    public int[] buildArray(int[] nums) {
        int n =nums.length;
        int []ans=new int[n];
        for(int i=0;i<n;i++){
            ans[i]=nums[nums[i]];
        }
        return ans;
    }
}

4)1480. 一维数组的动态和

  给你一个数组 n u m s nums nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i])。请返回 n u m s nums nums 的动态和。

4.a)题目分析:

  依然可以用数组解决,Java还是遍历数组。

4.b)代码:

   C C C代码

int* runningSum(int* nums, int numsSize, int* returnSize){
    int i;
        int *ans= (int *)malloc (numsSize*sizeof(int));
        for(i=0;i<numsSize;i++){
            ans[i]=nums[i];
            if(i){
                ans[i]+=ans[i-1];
            }
        }
        *returnSize=numsSize;
        return ans;
}

   j a v a java java代码

class Solution {
    public int[] runningSum(int[] nums) {
        int n = nums.length;
        for (int i = 1; i < n; i++) {
            nums[i] += nums[i - 1];
        }
        return nums;
    }
}

5)剑指 Offer 58 - II. 左旋转字符串

  字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串" a b c d e f g abcdefg abcdefg“和数字 2 2 2,该函数将返回左旋转两位得到的结果” c d e f g a b cdefgab cdefgab"。

5.a)题目分析:

  依然是指针

5.b)代码:

   C C C代码

char* reverse(char* s, int start, int end) {
    while (start < end) {
        char temp = s[start];
        s[start++] = s[end];
        s[end--] = temp;
    }
    return s;
}
char* reverseLeftWords(char* s, int n){
    int len = strlen(s);
    //反转前 n 个字符
    s = reverse(s, 0, n - 1);
    //反转 k 到末尾的字符
    s = reverse(s, n, len - 1);
    //反转整个字符串
    s = reverse(s, 0, len - 1);
    return s;
}

   j a v a java java代码

class Solution {
    public String reverseLeftWords(String s, int n) {
        return s.substring(n, s.length()) + s.substring(0, n);
    }
}

6)367. 1108. IP 地址无效化

6.a)题目分析:

   指针。

6.b)代码:

   C C C代码

char * defangIPaddr(char * address){
    int addressLen = strlen(address);
    int defAddressLen = addressLen + 7;
    char * defAddress = (char *)malloc(defAddressLen);
    memset(defAddress, 0, defAddressLen);

    int offset = 0;
    for(int i=0; i<addressLen; i++){
        if(address[i] == '.'){
            defAddress[offset] = '[';
            defAddress[offset+1] = '.';
            defAddress[offset+2] = ']';
            offset += 3;
        }else{
            defAddress[offset] = address[i];
            offset++;
        }
    }

    return defAddress;
}

   j a v a java java代码

class Solution {
    public String defangIPaddr(String address) {
              StringBuffer stringBuffer=new StringBuffer();
            for(int i=0;i<address.length();i++){
               if(address.charAt(i) == '.'){
                   stringBuffer.append("[.]");
               }else{
                   stringBuffer.append(address.charAt(i));
               }           
            }
            return new String(stringBuffer);
    }
}

7)剑指 Offer 05. 替换空格

7.a)题目分析:

   指针。

7.b)代码:

   C C C代码

char* replaceSpace(char* s){
    int len = strlen(s);
    int count = 0;
    for (int i = 0; i < len; i++) {
        if (s[i] == ' ') {
            count++;
        }
    }

    int newLen = len + 2 * count;
    char* result = malloc(sizeof(char) * newLen + 1);
    for (int i = 0, j = 0; i < len; i++, j++) {
        if (s[i] == ' ') {
            result[j] = '%';
            result[j + 1] = '2';
            result[j + 2] = '0';
            j += 2;
        } else {
            result[j] = s[i];
        }
    }
    result[newLen] = '\0';

    return result;
}

   j a v a java java代码

class Solution {
    public String replaceSpace(String s) {
        int length = s.length();
        char[] array = new char[length * 3];
        int size = 0;
        for (int i = 0; i < length; i++) {
            char c = s.charAt(i);
            if (c == ' ') {
                array[size++] = '%';
                array[size++] = '2';
                array[size++] = '0';
            } else {
                array[size++] = c;
            }
        }
        String newStr = new String(array, 0, size);
        return newStr;
    }
}

8)1365. 有多少小于当前数字的数字

8.a)题目分析:

   指针加循环。

8.b)代码:

   C C C代码

int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize) {
    int* ret = malloc(sizeof(int) * numsSize);
    *returnSize = numsSize;
    for (int i = 0; i < numsSize; i++) {
        int cnt = 0;
        for (int j = 0; j < numsSize; j++) {
            if (nums[j] < nums[i]) {
                cnt++;
            }
        }
        ret[i] = cnt;
    }
    return ret;
}

   j a v a java java代码

class Solution {
    public int[] smallerNumbersThanCurrent(int[] nums) {
        int n = nums.length;
        int[] ret = new int[n];
        for (int i = 0; i < n; i++) {
            int cnt = 0;
            for (int j = 0; j < n; j++) {
                if (nums[j] < nums[i]) {
                    cnt++;
                }
            }
            ret[i] = cnt;
        }
        return ret;
    }
}

9)剑指 Offer 17. 打印从1到最大的n位数

9.a)题目分析:

   指针,循环。

9.b)代码:

   C C C代码

int* printNumbers(int n, int* returnSize){
    int len=1,i;
    for(i=1;i<=n;i++)
        len*=10;//先计算要返回的数组的长度
        len--;
    *returnSize=len;
    int *ans=(int*)malloc(sizeof(int)*len);
    for(i=0;i<len;i++)
        ans[i]=i+1;
    return ans;
}

   j a v a java java代码

class Solution {
    public int[] printNumbers(int n) {
        int end = (int)Math.pow(10, n) - 1;
        int[] res = new int[end];
        for(int i = 0; i < end; i++)
            res[i] = i + 1;
        return res;
    }
}

10)1389. 按既定顺序创建目标数组

10.a)题目分析:

   指针加循环。

10.b)代码:

   C C C代码

int* createTargetArray(int* nums, int numsSize, int* index, int indexSize, int* returnSize){
    int* ret = (int*)malloc(sizeof(int) * indexSize);
    int tail = -1;
    for (int i = 0; i < indexSize; ++i) {
        ++tail;
        for (int j = tail; j > index[i]; --j) {
            ret[j] = ret[j - 1];
        }
        ret[index[i]] = nums[i];
    }
    *returnSize = indexSize;
    return ret;
}

   j a v a java java代码

class Solution {
    public int[] createTargetArray(int[] nums, int[] index) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < nums.length; ++i) {
            list.add(index[i], nums[i]);
        }
        int[] ret = new int[nums.length];
        for (int i = 0; i < nums.length; ++i) {
            ret[i] = list.get(i);
        }
        return ret;
    }
}

三、做题记录

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枏念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值