九日集训第四天
给你一个数组 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由于没有指针,可以直接遍历数组,重新排序即可。
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;
}
}
给你一个长度为 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 。
C语言思想本题与上题同理,Java则可以用取余计算。
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;
}
}
给你一个 从 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.length−1( 0 0 0 和 n u m s . l e n g t h − 1 nums.length - 1 nums.length−1 也包含在内)的不同整数组成的数组。
C语言还是用指针来解决问题,Java则可以遍历数组。
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;
}
}
给你一个数组 n u m s nums nums 。数组「动态和」的计算公式为:
runningSum[i] = sum(nums[0]…nums[i])
。请返回 n u m s nums nums 的动态和。
依然可以用数组解决,Java还是遍历数组。
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;
}
}
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串" a b c d e f g abcdefg abcdefg“和数字 2 2 2,该函数将返回左旋转两位得到的结果” c d e f g a b cdefgab cdefgab"。
依然是指针
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);
}
}
指针。
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);
}
}
指针。
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;
}
}
指针加循环。
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;
}
}
指针,循环。
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;
}
}
指针加循环。
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;
}
}