栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

九日集训第四天(指针)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

九日集训第四天(指针)

一、前言

九日集训第四天

二、题目 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 

   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 
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    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 

   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

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 

   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 
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 

   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 

   j a v a java java代码

class Solution {
    public String defangIPaddr(String address) {
              StringBuffer stringBuffer=new StringBuffer();
            for(int i=0;i 
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] = '';

    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 

   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 list = new ArrayList();
        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;
    }
}

三、做题记录

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/778110.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号