[睡前灵感and发散思维]由一个简单的数组比较问题而想到的

前言

据说,一只优秀的程序猿往往会有这样的经历,白天遇到一个绞尽脑汁也无法解决的问题,晚上睡了后,半夜在梦中会灵感涌现,立马起床,打开电脑,一气呵成。第二天如果不看注释,完全不知道自己找到了如此巧妙地解决方案。

昨晚躺床上,无意中想到一个问题,突然灵感爆发,想到巧妙解决方法,差点想起床写下来,只是寝室已断电,不了了之。早上爬起来,脸都没洗,先把文章敲了。

问题

非常简单的一个问题,长度为100和101的AB两个数组,数值范围为0-99,含重复,找出来多出来的一个数。

思路

一开始想到的是先排序,然后一趟比较找出不同。 排序方法一开始自然想到标准的快排,对于数字,还有基数与计数。

一想到计数,突然发现根本不需要排序,三次遍历可解。

  1. 遍历A数组,用数组Count计数;
  2. 遍历B数组,Count[B[i]]--;
  3. 遍历Count,值为-1的下标即为所求;

举一反三

然后思维就发散了,进一步想了下

  • 长度为100和100+n,找出多出的n个;
  • 找出相同的n个,即子集;
  • 对于三个数组,求子集(计数数组值为3的下标就是);
  • 对于两个数组,求其元素异同

举三反N

  • 对于n个数组,求子集(计数为n为所求)
  • 对于n个数组,求其元素的异同

举N反N^N

如果题目没给的范围,或者不是数字,大数据量咋办、

  • 比如两个元素数组,找出其中一个不同的元素

如果元素值是唯一的,hash,第二次遍历时,hash冲突的即为所求

结论

。。。

结果是昨晚凌晨两三点才睡着,结论就是不能再想了,发散思维太可怕T^T。。

程序猿容易用脑过度,晚上还是好好休息,别想太多,当然,梦中的突然灵感还是要立马爬起床写下来的,毕竟有时候百分之一的灵感更重要。。。

时间: 2024-10-10 05:44:06

[睡前灵感and发散思维]由一个简单的数组比较问题而想到的的相关文章

python3开发进阶-Django框架学习前的小项目(一个简单的学员管理系统)

''' 自己独立写一个学员管理系统 表结构: 班级表: -id -grade_name 学生表: -id -student_name -grade 关联外键班级表 老师表: -id -teacher_name -grades (多对多 关联班级表) ''' 在写小项目之前我们先复习一下小知识: 1. form表单提交数据的注意事项: 是form不是from,必须要有method和action 所有获取用户输入的表单标签要放在form表单里面,表单标签必须要有name属性 form表单必须要有su

---python_List---它不是一个简单的数组

第一次,学python的时候,我看到列表这个词语,并不知道这是什么东西.听名字,感觉很高大上.当学习列表完,原来只不过就是一个数组(数组的升级版). List是python里面最基本的数据结构.序列中每个元素都是从索引(下标)从0开始,依次叠加. List操作的方法很多,只能熟悉基本常用的这个方法. 第二个数据结构是元祖,元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表. 元祖的方法只有count和index. 1.切片(获取多个元素) 1 poets = [

一个简单的数组类操作

要求定义一个数组类,动态分配数组大小,并实现反转与排序操作. 代码如下: class Array { private int a[] = null; private int foot=0; public Array(int len) { if (len > 0) this.a = new int[len]; else this.a = new int[1]; } public boolean add(int i){ if(this.foot<this.a.length){ this.a[foo

一个简单粗暴的前后端分离方案

项目背景 刚刚参加完一个项目,背景:后端是用java,后端服务已经开发的差不多了,现在要通过web的方式对外提供服务,也就是B/S架构.后端专注做业务逻辑,不想在后端做页面渲染的事情,只向前端提供数据接口.于是协商后打算将前后端完全分离,页面上的所有数据都通过ajax向后端取,页面渲染的事情完全由前端来做.另外还有一个紧急的情况,项目要紧急上线,整个web站点的开发时间只有两周,两周啊!于是在这样的背景下,决定开始一次前后端完全分离的尝试. 之前开发都是同步渲染和异步渲染混搭的,有些东西可以有后

Oracle 9.2.0.4的一个简单安装脚本(含安装前补丁p3006854)

#! /bin/bashecho "#########oracle9R204 的一个简单的安装脚本 ##############################"## 为系统添加oracle的用户和用户组#groupadd dbagroupadd oinstalluseradd -c "Oracle software owner" -g oinstall -G dba oraclepasswd oracle # 创建oracle 的安装目录 mkdir /oracl

一个简单粗暴的前后端分离方案(转)

项目背景 刚刚参加完一个项目,背景:后端是用java,后端服务已经开发的差不多了,现在要通过web的方式对外提供服务,也就是B/S架构.后端专注做业务逻辑,不想在后端做页面渲染的事情,只向前端提供数据接口.于是协商后打算将前后端完全分离,页面上的所有数据都通过ajax向后端取,页面渲染的事情完全由前端来做.另外还有一个紧急的情况,项目要紧急上线,整个web站点的开发时间只有两周,两周啊!于是在这样的背景下,决定开始一次前后端完全分离的尝试. 之前开发都是同步渲染和异步渲染混搭的,有些东西可以有后

一个简单编译器前端的实现

小记: 其实这个程序是编译原理这门课的综合实验,前段时间我申请免试又失败了,原因是有缺课,平时分不够,早上赖床现在尝到苦果我也是醉了……没办法,逼上梁山,只好攻克这个大boss以拿下免试资格. 选了一个最简单的文法,分析了1个多星期,终于决定开始要写的时候时间已经很紧了. 去实验室通宵了一晚,在宿舍熬了一晚,睡了3个小时就起来去验收了.还好是通过了,没白费劲. 不得不说,编译原理就是烧脑,知识点都比较抽象,如果数据结构和算法的基础打得不牢的话,实现起来会感到吃力. 再次感觉到了基础的重要性,这也

计算机程序的思维逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列

本节介绍内存映射文件,内存映射文件不是Java引入的概念,而是操作系统提供的一种功能,大部分操作系统都支持. 我们先来介绍内存映射文件的基本概念,它是什么,能解决什么问题,然后我们介绍如何在Java中使用,我们会设计和实现一个简单的.持久化的.跨程序的消息队列来演示内存映射文件的应用. 基本概念 所谓内存映射文件,就是将文件映射到内存,文件对应于内存中的一个字节数组,对文件的操作变为对这个字节数组的操作,而字节数组的操作直接映射到文件上.这种映射可以是映射文件全部区域,也可以是只映射一部分区域.

睡前数学一小时之线性筛素数:

睡前数学一小时之线性筛素数:1,朴素的筛素数算法:埃拉托斯特尼筛法.这是个简单再简单不过的一个素数的筛法.只是名字很拉风.这就告诉我们,往往东西不好这没什么,名字很拉风.别人也不会记住.hhhhh.这个的思路就是.每一个数都是由一个质数与和数(质数也可以)的积组成.这也是质数与和数的定义.而这个它这个筛发,就是当遇到一个质数的时候开始枚举,枚举[1,n]中间关于这个质数的倍数.每次都枚举,每次都将算出的这个数打上标记.而最后整个区间内的质数枚举完后,整个区间内的质数也就筛选出来了.这个很简单.时