Home 成长之路 Leetcode题解

给你两个整数,n 和 start 。
数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == nums.length 。
请返回 nums 中所有元素按位异或(XOR)后得到的结果。
示例 1:
输入:n = 5, start = 0
输出:8
解释:数组 nums 为 [0, 2, 4, 6, 8],其中 (0 ^ 2 ^ 4 ^ 6 ^ 8) = 8 。
“^” 为按位异或 XOR 运算符。
解题思路:循环异或输出结果;
int xorOperation(int n, int start){

      int  *nums=(int *)malloc(sizeof(int)*n);

      int  k=0;
      for(int i=1;i<n;i++)
      {  
            k^=start+2*i;
      }
return k;
}

给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。
请返回 nums 的动态和。
示例 1:
输入:nums = [1,2,3,4]
输出:[1,3,6,10]
解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。
解题思路:原数组上进行操作;
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int *runningSum(int *nums, int numsSize, int *returnSize)
{
   for(int i=1;i<numsSize;i++)
        {
               nums[i]+=nums[i-1];
        }
*returnSize=numsSize;
return nums;
}

给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。
请你计算并返回该式的最大值。
示例 1:
输入:nums = [3,4,5,2]
输出:12
解释:如果选择下标 i=1 和 j=2(下标从 0 开始),则可以获得最大值,(nums[1]-1)*(nums[2]-1) = (4-1)*(5-1) = 3*4 = 12 。
解题思路:关键在于找出第一大和第二大的值;
方法一:冒泡排序,求(nums[0])*(nums[1])的值;
方法二:双指针,一个指向最大,一个指向第二大,不用排序;
int maxProduct(int* nums, int numsSize){
int first = nums[0] > nums[1] ? nums[0] : nums[1];
int second = nums[0] > nums[1] ? nums[1] : nums[0];
for (int i = 2; i < numsSize; i++) {
if (nums[i] >= first) {
second = first;
first = nums[i];
} else {
if (nums[i] > second) {
second = nums[i];
}
}
}
return (first – 1) * (second – 1);
}

给你两个长度相同的整数数组 target 和 arr 。
每一步中,你可以选择 arr 的任意 非空子数组 并将它翻转。你可以执行此过程任意次。
如果你能让 arr 变得与 target 相同,返回 True;否则,返回 False 。
示例 1:
输入:target = [1,2,3,4], arr = [2,4,1,3]
输出:true
解释:你可以按照如下步骤使 arr 变成 target:
1- 翻转子数组 [2,4,1] ,arr 变成 [1,4,2,3]
2- 翻转子数组 [4,2] ,arr 变成 [1,2,4,3]
3- 翻转子数组 [4,3] ,arr 变成 [1,2,3,4]
理解题意:目的是比较两数组是否相等
方法一:先排序,再同时移动下标进行比较;
方法二:新建数组K,将target[i]和arr[i]当成其下标,进行K[target[i]]++和K[arr[i]]–操作,若两数组相同,K应该不变;

给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,…,xn,y1,y2,…,yn] 的格式排列。

请你将数组按 [x1,y1,x2,y2,…,xn,yn] 格式重新排列,返回重排后的数组。

示例 1:

输入:nums = [2,5,1,3,4,7], n = 3
输出:[2,3,5,4,1,7]
解释:由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ,所以答案为 [2,3,5,4,1,7]

解题思路:新建数组arr,可知arr[0]=x1,arr[1]=y1,又可知x1与y1之间下标相差n,循环将x1,y1赋值给新数组;

for(int i=0;i<n;i++)

{     arr[i++]=nums[i];

arr[i++]=nums[i+n];

}