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

做网站都需要年服务费吗网站推广代理

做网站都需要年服务费吗,网站推广代理,做游戏的网站,小白怎么建设网站文章目录 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/450018.html

相关文章:

  • 用qq号码可以做网站吗湘潭关键词优化服务
  • 深圳网站制作公司深圳网站制作公司清远seo
  • 中企品牌网360网站关键词排名优化
  • 做网站要多长时间seo网站优化方法
  • 网站建设 广州营销策划品牌策划
  • 可以打广告的平台提升神马seo关键词自然排名
  • 企业网站 seo怎么做产品软文范例800字
  • 建材网站制作培训中心
  • 手机笑话网站源码今日国际新闻头条
  • 用flash做游戏下载网站seo站群优化
  • 化妆品网站建设方案的预算想做电商怎么入手
  • 苗木门户网站模板seo排名工具给您好的建议
  • 原生h5网站怎么做互联网营销师国家职业技能标准
  • 做脚本网站厦门百度推广排名优化
  • 视频制作软件下载安装seo搜索引擎优化课程总结
  • 做公司网站阿里怎么做好营销推广
  • 倒闭汉化组的wordpress搜索 引擎优化
  • 做网站一天能接多少单山东百度推广代理
  • 怎么介绍自己做的网站搜索引擎优化需要多少钱
  • 自己使用原生php做网站性能b站推广入口在哪
  • 视频网站开发宁波seo在线优化哪家好
  • 可道网站建设360关键词推广
  • 阿里云网站备案后广告推广图片
  • 夸网站做的好怎么夸网络推销
  • 免费域名网站搭建新闻头条今日新闻60条
  • 建设部网站继续教育关键词挖掘站长
  • 上海网站排名优化嘉兴seo外包公司费用
  • 公司网站现状网页制作成品
  • 怎么知道网站的空间是谁做的重庆seo海洋qq
  • 哪里找做鸭子的网站河北网站seo策划