OJ1——轮转数组,消失的数字

embedded/2024/9/23 4:54:05/

题目1——轮转数组

题目来源. - 力扣(LeetCode)

轮转(或称为旋转)数组是一种常见的算法问题,通常指的是将数组中的元素向右或向左移动一定位置,使得数组的元素重新排列。

以下是一个简单的思路,用于解决将数组向右轮转k个位置的问题(其中k小于或等于数组长度):

思路一:三次翻转法

  1. 翻转整个数组:首先,将整个数组翻转。
  2. 翻转前k个元素:然后,翻转数组的前k个元素。
  3. 翻转剩余元素:最后,翻转数组中从第k个元素到末尾的部分。

通过这三次翻转,你可以得到向右轮转k个位置的数组。

 

  

// 翻转数组从start到end的部分  
void reverse(int* nums, int start, int end) {  while (start < end) {  int temp = nums[start];  nums[start] = nums[end];  nums[end] = temp;  start++;  end--;  }  
}  // 原地向右轮转数组k个位置  
void rotate(int* nums, int numsSize, int k) {  k %= numsSize; // 确保k不超过数组长度  reverse(nums, 0, numsSize - 1); // 翻转整个数组  reverse(nums, 0, k - 1); // 翻转前k个元素  reverse(nums, k, numsSize - 1); // 翻转剩余元素  
}  

思路二:额外空间法

以下是额外空间法的步骤:

  1. 创建新数组:首先,根据原数组的大小,创建一个新的数组。这个新数组将用于存储轮转后的结果。

  2. 计算新位置遍历原数组中的每个元素,根据轮转规则计算出该元素在新数组中的位置。对于向右轮转k个位置的情况,元素nums[i]在新数组中的位置将是(i + k) % numsSize,其中numsSize是原数组的大小。

  3. 复制元素:将原数组中的每个元素复制到新数组中计算出的位置上。

  4. (可选)替换原数组:如果题目要求原地修改数组,则可以在复制完所有元素后,将新数组中的元素复制回原数组。但如果题目只是要求返回轮转后的数组,那么可以直接返回新数组。

这种方法使用了额外的空间,但代码可能更直观和易于理解。

// 使用额外空间轮转数组  
void rotate(int* nums, int numsSize, int k) {  k %= numsSize; // 确保k不超过数组长度  int* rotated = (int*)malloc(numsSize * sizeof(int));if(roated==NULL){assert(roated);perror("malloc failed");exit(-1)}  // 将元素放到新数组的正确位置  for (int i = 0; i < numsSize; i++) {  rotated[(i + k) % numsSize] = nums[i];  }  // 将新数组的元素复制回原数组  for (int i = 0; i < numsSize; i++) {  nums[i] = rotated[i];  }  // 释放额外空间  free(rotated);  
}  

题目2——消失的数字

题目来源:. - 力扣(LeetCode)

思路——异或 

异或运算有一个重要的性质:对于任何数x,都有x^x = 0x^0 = x

我们可以先对从0到n的所有整数进行异或操作,得到一个结果xor_total

然后,遍历给定的数组,对数组中的每个数字进行异或操作,将结果与xor_total进行异或。

由于异或运算的性质,所有在数组中出现两次的数字都会相互抵消,最后剩下的就是缺失的那个数字。

int missingNumber(int* nums, int numsSize) {  int xor_total = 0; // 用于存储从0到n的异或结果  for (int i = 0; i <= numsSize; i++) { // 遍历从0到n的所有整数  xor_total ^= i; // 对每个整数进行异或  }  for (int i = 0; i < numsSize; i++) { // 遍历给定的数组  xor_total ^= nums[i]; // 对数组中的每个数字进行异或  }  return xor_total; // 返回异或的结果,即缺失的数字  
}  


http://www.ppmy.cn/embedded/27652.html

相关文章

Android 文件传输

经常写adb命令传文件&#xff0c;结果发现Android studio有自带的文件管理器&#xff0c;可以上传下载文件。

PyVista 3D数据可视化 Python 库 一行代码实现裁剪 含源码

简介&#xff1a; Pyvista是一个用于科学可视化和分析的Python库,使3D数据可视化变得更加简单和易用&#xff1b; 只增加一行代码就可以实现裁剪&#xff1b; 1.效果&#xff1a; 2.代码如下&#xff1a; 加载模型数据&#xff1a; 代码实现&#xff1a; import pyvista a…

LeetCode LCR 179. 和为s的两个数字

原题链接&#xff1a;LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 题目的意思&#xff1a;通过给定的数组&#xff0c;找出两个值&#xff0c;相加并等于目标值。 第一种思路&#xff0c;暴力枚举&#xff0c;伪代码如下&#xff1a; for (…

设计模式的原则与分类

一、设计模式的原则 1、单一职责原则 一个类只需要负责一种职责即可&#xff0c;一个类发生变化的原因&#xff0c;必然是所负责的职责发生变化 2、接口隔离原则 单一职责原则是接口隔离原则的基础&#xff0c;单一职责原则注重职责的划分&#xff0c;从职责角度进行类和接口…

计算机炸了电子信息也是劝退专业

之前不如&#xff0c;之后不一定。 现在是2024年5月&#xff0c;互联网往年的金三银四&#xff0c;今年变成了铜三铁四&#xff0c;甚至铜铁都不如。&#x1f975; 互联网的红利已经消耗殆尽了&#xff0c;高薪是不可持续的。 既得利益者仍然会很有钱&#xff0c;但这个行业后面…

数据结构之树形结构

树形结构的例子非常丰富&#xff0c;涵盖了从自然界的生态系统到计算机科学的各种领域。以下是几个典型的树形结构例子&#xff1a; 1.家族树&#xff1a;在家族谱系中&#xff0c;家族树是一个典型的树形结构。它从一个共同的祖先&#xff08;根节点&#xff09;开始&#xff…

openlayer 使用ol-ext插件实现凸显区域

使用ol-ext插件实现凸显多变形 效果如图 1、创建openlayer var map; var view; var tileLayer, source, vector;function init() {tileLayer new ol.layer.Tile({source: new ol.source.TileArcGISRest({url: "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStr…

php 使用链接接收两个参数

要在 PHP 中从链接接收两个参数&#xff0c;您可以使用超链接&#xff08; 标签&#xff09;并将参数附加到链接的 URL 中。在 PHP 中&#xff0c;您可以从 URL 中提取这些参数以供后续处理。下面是一个简单的示例代码&#xff0c;演示如何从链接接收两个参数&#xff1a; 假设…