本篇博客会讲解力扣“1920. 基于排列构建数组”的解题思路,这是题目链接。

先来审下题:

以下是输出示例:


以下是提示:

相信读完题的你已经感到没啥意思了,感觉做这道题就是在浪费时间。但是还是建议你看下去,接下来会有一个很有意思的思路。在讲解这个有意思的思路之前,先按照正常的思路实现一下:

int* buildArray(int* nums, int numsSize, int* returnSize) {int* ret = (int*)malloc(sizeof(int) * numsSize);*returnSize = numsSize;// 根据指定规则,构建数组for (int i = 0; i < numsSize; ++i){ret[i] = nums[nums[i]];}return ret;
}

这样就过了。事实上,我更推荐这个正常的思路。不过这个思路开辟了一个新的数组,有没有什么手段,直接在原数组上操作呢?

你可能会问:怎么可能?难道我们要同时在一个数组中存储原数据和结果数据?

答案是:是的!类比一下:假设我们要存储的数据是10以内的,那么用一个十进制数就能够存的下了。比如:37就代表了2个数,一个是37%10=7,另一个是37/10=3。

而本题中的数据是1000以内的,所以可以用“1000进制”来存储。我们规定一个数n,n%1000代表原数据,而n/1000代表结果数据。那么我们就可以遍历数组,对nums[i]做如下操作:

nums[i] += 1000 * (nums[nums[i]] % 1000);

在nums[i]操作之前,nums[i]的值就是它本身,可以使用nums[nums[i]]找到其中的原数据,但是还要%1000。找到该数据后,还要存储到nums[i]中,就*1000再加到nums[i]上即可。实际拿出结果数据,只需要/1000

具体实现的代码如下:

int* buildArray(int* nums, int numsSize, int* returnSize){// nums[i]<1000,故采取1000进制// nums[i]%1000为原来数据// nums[i]/1000为结果数据for (int i = 0; i < numsSize; ++i){nums[i] += 1000 * (nums[nums[i]] % 1000);}// 取出结果数据for (int i = 0; i < numsSize; ++i){nums[i] /= 1000;}*returnSize = numsSize;return nums;
}


这样也能过。

总结

  1. 常规思路没什么好说的。
  2. 如果我们想把两个1000以内的数存储到一块空间中,可以使用1000进制。

感谢大家的阅读!

从10进制到1000进制:一场数字的盛宴相关推荐

  1. 蓝桥杯基础之16进制、10进制、8进制、2进制换算总结

    常用函数的一些小总结 string to int(字符串转到int类型) #include<sstream> //重要的库 #include<iostream> #includ ...

  2. 【十进制 转 二进制】【二进制 转 十进制】10进制 VS 2进制【清华大学考研机试题】

    10进制 VS 2进制 十进制转成二进制 二进制 转成 十进制 本题是高精度,如何做? 原题链接 本题我们先需要知道 十进制 如何转 二进制 二进制 如何转 十进制 十进制 如何转 二进制: 十进制转 ...

  3. 【python】用python进行进制转换(10进制、2进制、16进制)

    进制转换 ① 16进制转10进制 ② 16进制转2进制 ③ 10进制转16进制 ④ 10进制转2进制 ⑤ 2进制转16进制 ⑥ 2进制转10进制 博客由来写在前面:由于计组老师要求我们课后查一下进制转 ...

  4. POJ3353 1000进制大整数|水题|题意揣摩

    poj.org/problem?id=3353 这道题,10%的AC率,看着有点害怕 Total Submissions: 593 Accepted: 54 但是题目读起来并不能难,只是简单得类似罗马 ...

  5. 1952 Problem F 10进制 VS 2进制

    问题 F: 10进制 VS 2进制 时间限制: 1 Sec 内存限制: 32 MB 献花: 27 解决: 18 [献花][花圈][TK题库] 题目描述 对于一个十进制数A,将A转换为二进制数,然后按位 ...

  6. 16进制转8进制 两种方法先转二进制在转8进制或先转10进制在转8进制

    问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由09.大写字母AF组成的字符串,表示要转换的 ...

  7. 10进制和64进制互转

    以前写过16进制和64进制的转换函数,今天做下载页的短连接,突然想到可以吧id转换为64进制,让地址看起来更短,下面是代码,分享给大家.性能测试,1000次计算互转计算,4位64进制数(aaaa:26 ...

  8. 题目1208:10进制 VS 2进制(进制转换以及大数保存问题)

    题目链接:http://ac.jobdu.com/problem.php?pid=1208 详细链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  9. leetcode 168. Excel表列名称(10进制转26进制)

    题目 思路 10进制转26进制 经过分析,我们不难发现,这是一个26进制和十进制相互转换的问题.序列A-Z依次对应序列1-26.进制转换的基本办法就是"取余法",换算规则如下: A ...

最新文章

  1. 这里天刚黑,而家里都已经后半夜了
  2. java无参试题_JavaEE基础面试题0
  3. 实现类似Android联系人搜索功能
  4. RocketMQ 4.5.1 环境搭建
  5. LinkedList的实现原理
  6. apt get php mysql_Ubuntu10用apt-get配置apache+php+mysql(轉)
  7. apollo源码分析 感知_Scikit-Learn 源码研读 (第一期)项目结构介绍
  8. Ribbon和Feign的对比-带简易例子
  9. 网页设计与制作项目教程HTML+CSS+JavaScript之项目三 flower shop
  10. 无人机运动规划4:ego-swarm无人机群运动规划
  11. 【4月比赛合集】19场可报名的「创新应用」和「程序设计」大奖赛,任君挑选!
  12. android高仿微信拍摄,Android 仿微信视频拍摄 支持触摸拍摄 长按拍摄
  13. AD21调整PCB大小操作步骤!
  14. 存储性能指标--iops
  15. 有道云笔记4年的用户体验
  16. Android Studio Canvas 实现鼠标贝塞尔曲线拖尾特效(富文本编辑器)
  17. 下列对C语言特点的描述中 错误的是,下列对C语言特点的描述中,错误的是。
  18. sqlmap使用图解
  19. 基恩士MC协议 虚拟服务器,C#读写基恩士PLC 使用TCP/IP 协议 MC协议
  20. 经验:几个985/211/普通院校的本科生/研究生高薪大数据学习全程记录,笔记心得,求职面试

热门文章

  1. 04证券市场典型违法违规行为及法律责任
  2. u盘文件损坏怎么恢复数据?好用的数据恢复软件
  3. SAP 过账显示不在允许过账期间 消息号M7053
  4. rcnn 回归_基础目标检测算法介绍:CNN、RCNN、Fast RCNN和Faster RCNN
  5. Magix发布Samplitude Pro X7
  6. 2分钟教你学会一键JS解密
  7. Unity编辑器拓展(Gizmos)
  8. 计算机地质绘图实验报告,计算机地质绘图实习报告作业二.doc
  9. Ubuntu服务器找不到网卡
  10. 【读点论文】Fawkes: Protecting Privacy against Unauthorized Deep Learning Models 添加像素扰动来实现图片的对抗AI识别