九日集训第四天
二、题目 1)1470. 重新排列数组1.a)题目分析:给你一个数组 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] 格式重新排列,返回重排后的数组。
本题在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;
}
}
三、做题记录



