当前位置: 首页 > wzjs >正文

京东网站是哪个公司做的看b站视频软件下载安装手机

京东网站是哪个公司做的,看b站视频软件下载安装手机,中国纪检监察报理论版,it外包服务包括哪些文章目录 1、消失的数字1.1 题目描述1.2 题目分析 2、轮转数字2.1 题目描述2.2 题目分析 1、消失的数字 原题链接:消失的数字 1.1 题目描述 数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗…

文章目录

  • 1、消失的数字
    • 1.1 题目描述
    • 1.2 题目分析
  • 2、轮转数字
    • 2.1 题目描述
    • 2.2 题目分析

1、消失的数字

原题链接:消失的数字

1.1 题目描述

数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
注意:本题相对书上原题稍作改动

示例 1:
输入:[3,0,1]
输出:2

示例 2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8

1.2 题目分析

思路一:
首先想到的思路是等差数列求和,数组nums包含0到n的所有整数,但是缺了一个,那么我们只需要对0到n求和,再将得到的前n项和减去数组的和,得到的差值就是那个缺失的数字。
代码实现:

int missingNumber(int* nums, int numsSize) {int sum = numsSize * (numsSize + 1) / 2;for(int i = 0;i < numsSize; ++i){sum-=nums[i];}return sum;
}

思路二:
第二个思路是利用位运算。常见的位运算有按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)、右移(>>)。
我们这里要用到的是按位异或(^),按位异或是相同为0不同为1,例如5 ^ 3,5的二进制是0101,3的二进制的0011,他们按位异或的结果就是0110,也就是6。任何整数和它本身按位异或,得到的结果都是0,和0按位异或,得到的结果是它本身。
首先nums数组中有n个数,而0到n有n+1个数,总共2n+1个数,而那个消失的数字只在n+1个数中出现一次,而其他数字都出现了两次,所以我们可以用0对这2n+1个数依次按位异或,得到的最后结果就是那个消失的数字。
举个小例子:
nums:[0,1,3]
0~n:0 1 2 3
先让0和nums依次按位异或:

  1. 0^0 = 0
  2. 0^1 = 1
  3. 1^3 = 2

再让2和0~n依次按位异或:

  1. 2^0 = 2
  2. 2^1 = 3
  3. 3^2 = 1
  4. 1^3 = 2

可以看到,最终的结果就是消失的2
代码实现如下:

int missingNumber(int* nums, int numsSize) {int x = 0;int n = numsSize;for(int j = 0;j < numsSize;++j){x^=nums[j];}for(int i = 0;i <= n;++i){x ^= i;}return x;
}

2、轮转数字

原题链接:轮转数组

2.1 题目描述

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

示例 2:

输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

2.2 题目分析

思路一:
使用memcpy()函数,该函数的用法在cppreference中如下:
https://legacy.cplusplus.com/reference/cstring/memcpy/?kw=memcpy
在这里插入图片描述
它一共有三个参数,第一个表示要复制到的目标内存块,第二个是表示我们要复制的内容,第三个是我们要复制的字节数。
首先我们让k和数组的长度进行取模,这样做的原因是,当k和numsSize为倍数关系时,数组轮转后还是原来的数组,取模可以减少不必要的重复计算。紧接着我们创建一个临时数组tmp,用来存储旋转后的元素,在进行拷贝的过程中,要确定自己的拷贝位置以及要拷贝的字节数。
首先我们要先把nums数组中的后k个元素复制到tmp数组的起始位置,然后再把nums数组前numsSize-k个元素复制到tmp数组中,从下标为k的位置上开始放,因为题目要我们返回的是nums数组,因此最后一步我们将tmp整个拷贝到nums,完成旋转操作。
实现代码如下:

void rotate(int* nums, int numsSize, int k) {k %= numsSize;int tmp[numsSize];//0  n-k-1   n-k  n-1memcpy(tmp,nums+numsSize-k,sizeof(int)*k);memcpy(tmp+k,nums,sizeof(int)*(numsSize-k));memcpy(nums,tmp,sizeof(int)*numsSize);
}

思路二: 先逆置前n-k个,再逆置后k个,最后将整个数组逆置。

假设现在有一个数组[1,2,3,4,5],k = 3,先逆置前n-k个也就是前2个,得到数组[2,1,3,4,5],再逆置后k个也就是后三个,得到数组[2,1,5,4,3],再整体逆置,得到数组[3,4,5,1,2],得到最终答案。

我们可以先封装一个逆置函数,即左右双指针向中间步进,借助第三个变量来逆置。然后再根据上面的思路对数组进行分段逆置。
代码实现如下:

void Reverse(int* a, int left, int right)
{while(left<right){int tmp = a[left];a[left] = a[right];a[right] = tmp;++left;--right;}
}void rotate(int* nums, int numsSize, int k) {k %= numsSize;Reverse(nums,0,numsSize-k-1);Reverse(nums,numsSize-k,numsSize-1);Reverse(nums,0,numsSize-1);
}

本期文章就到这里啦,刷题系列会紧随我的刷题进度不断更新的,大家如果有想到更优化的方法,也可以在评论区提出,有不足和错误的地方,也请指出,下一篇文章见,拜拜~

http://www.dtcms.com/wzjs/208437.html

相关文章:

  • 重庆环保公司网站建设优秀网站设计赏析
  • 做网站后台搜搜
  • 我们不仅仅做网站更懂得网络营销如何进行品牌宣传与推广
  • 网站开发数据库郑州百度推广外包
  • 电子商务网站和普通网站的区别免费网络推广网址
  • wordpress费用seo实战培训费用
  • 三亚做网站服务河南企业网站推广
  • 做网站企业 金坛运营怎么做
  • 网站建设方案范文8篇网页制作成品模板网站
  • 网站建设培训手册有没有免费的写文案的软件
  • 长沙冠讯网络科技有限公司seo建站收费地震
  • 坪地网站建设信息新产品推广方式有哪些
  • 东莞保安百度seo排名优化公司哪家强
  • 上海建网站的公司推广app
  • 西安网站建设推荐q479185700上墙官方百度下载安装
  • 男人和女人做哪个网站百度秒收录软件
  • 网站上传空间的ip地址java培训班
  • b2c网站对比怎么去推广自己的店铺
  • wordpress取消草稿seo刷排名公司
  • 政府网站安全建设网站设计案例
  • 电子商务网站流程设计查询网址域名ip地址
  • aspx网站做app有趣的网络营销案例
  • 赣州人才网官方网站网页设计与制作学什么
  • 本地建设网站软件下载百度关键词排名推广工具
  • 凡科官网免费制作西安优化外
  • 郑州大学动态网站建设下载百度语音导航地图
  • 经营性网站备案流程关键词查询工具软件
  • 网站自适应 如何做互联网公司有哪些
  • 鲨皇seo惠州搜索引擎seo
  • 网络营销权威概念是百度seo优化公司