数组公式

判断一个数能否通过一个数组中的数相乘而得到--类似完全背包问题,动态规划

丶灬走出姿态 提交于 2020-02-18 15:52:31
1.题目描述: 判断一个数能否通过一个数组中的数相乘而得到(数组中的数使用次数不限) 例如:第一行输入目标数x,第二行再输入一个数组(每个数用空格隔开),如果能则输出1,不能则输出-1; 输入例1: 20 2 3 5 7 输出: 1 解释:20 = 2 2 5,可以组成,所以输出1. 输入例2: 20 3 5 7 输出: -1 解释:无法组成,所以输出-1. 解题思路 2.1错误想法 如20 数组为2,3,5,7 我们把每个数都除到不能整除,举例20/2/2=5 ,5/3不除, 5/5=1结束 while((cin >> tmp)){ if(x==1)break; while((float)x/(float)tmp - x/tmp ==0){//可以整出没有小数 x = x/tmp; } if(cin.get()=='\n'){ break; } } if(x==1){ cout <<1<<endl; }else{ cout <<-1<< endl; } 以上代码对于12 数组6 3 4 不成立,其原因是最终结果 3,4不包含6,而12却可以整除6. 按上面的流程是12/6 =2 ,2/3不整除,2/4不整除。 2.2转换为完全背包问题(使用动态规划解决) 原因分析:对于从 一堆数 中挑选重复若干数 乘积看是否得到某数 类似 在容量限制下,从一堆物品中重复挑若干物品组成价值最高

Map源码会问哪些面试题

爷,独闯天下 提交于 2020-02-18 15:20:34
1 Map 整体数据结构类问题 1.1 说一说 HashMap 底层数据结构 答:HashMap 底层是数组 + 链表 + 红黑树的数据结构,数组的主要作用是方便快速查找,时间复杂度是 O(1),默认大小是 16,数组的下标索引是通过 key 的 hashcode 计算出来的,数组元素叫做 Node,当多个 key 的 hashcode 一致,但 key 值不同时,单个 Node 就会转化成链表,链表的查询复杂度是 O(n),当链表的长度大于等于 8 并且数组的大小超过 64 时,链表就会转化成红黑树,红黑树的查询复杂度是 O(log(n)),简单来说,最坏的查询次数相当于红黑树的最大深度。 1.2 HashMap、TreeMap、LinkedHashMap 三者有啥相同点,有啥不同点? 答:相同点: 三者在特定的情况下,都会使用红黑树; 底层的 hash 算法相同; 在迭代的过程中,如果 Map 的数据结构被改动,都会报 ConcurrentModificationException 的错误。 不同点: HashMap 数据结构以数组为主,查询非常快,TreeMap 数据结构以红黑树为主,利用了红黑树左小右大的特点,可以实现 key 的排序,LinkedHashMap 在 HashMap 的基础上增加了链表的结构,实现了插入顺序访问和最少访问删除两种策略; 由于三种 Map

归并排序

徘徊边缘 提交于 2020-02-15 12:23:01
归并排序分治法的一个典型且基本的应用。它的基本思想是:将对N个对象的问题转换成两次对N/2个对象的问题。归并排序减少了数据的比较次数,转而增加了数据的移动次数,使得排序速度相对较快。该算法的递推公式T(N) = 2T(N/2) + O(N)表明其算法复杂度上限为O(NlogN)。下面是其C++代码: 1 #include<cstring> 2 #include<cstdio> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 int innersort(int* A,int left,int right,int* CPY) 8 {//[left,mid]and[mid+1,right]; 9 if(right==left)return 0; 10 int mid=(left+right)/2; 11 int i=left,k=mid+1; 12 int cur=left; 13 while(i!=mid+1&&k!=right+1) 14 { 15 if(A[i]>A[k])CPY[cur++]=A[k++]; 16 else CPY[cur++]=A[i++]; 17 }//一定有一侧的数据会最先完成排序 18 while(i!=mid+1)CPY[cur++]=A[i++]; 19

为什么很多编程语言中数组都从0开始编号

天涯浪子 提交于 2020-02-13 10:35:25
寻址方式的原因 从数组存储的内存模型上来看,“下标”最确切的定义应该是“ 偏移 (offset)”。 如果用 a 来表示数组的首地址,a[0]就是偏移为 0 的位置,也就是首地址。 a[k]就表示偏移 k 个 type_size 的位置,所以计算 a[k]的内存地址就是 a[k]_address = base_address + k * type_size 我们拿一个长度为 10 的 int 类型的数组 int[] a = new int[10]来举例。 计算机给数组 a[10],分配了一块连续内存空间 1000~1039,其中,内存块的首地址为 base_address = 1000。 计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。 当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址: a[i]_address = base_address + i * data_type_size //data_type_size 表示数组中每个元素的大小。 但是,如果数组从 1 开始计数,那我们计算数组元素 a[k]的内存地址就会变为 a[k]_address = base_address + (k-1)*type_size 从 1 开始编号,每次随机访问数组元素都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令。

数组(Array)——数组介绍

Deadly 提交于 2020-02-13 03:36:03
Arrays(数组) 数组是一个固定长度的存储相同数据类型的数据结构,数组中的元素被存储在一段连续的内存空间中。它是最简单的数据结构之一,大多数现代编程语言都内置数组支持。 为何使用数组存储一堆变量 与单独为每一个元素声明一个变量名相比,我们可以使用数组的索引值访问数组中的每一个元素。 例如:我们需要实现一个系统来存储办公室所有员工的年龄,传统的存储方式如下: 我们为办公室的每一个员工创建一个变量。假设办公室由三个员工,只需声明三个变量:empl_age,emp2_age和emp3_age. 当我们新招募员工进来时,我们需要创建更多的变量来存储员工的年龄。维护这样的系统非常麻烦,每添加一个新的员工,我们就需要修改这个系统的代码。 要人工计算超过20个员工的平均年龄,逐一访问每一个变量让人头痛的。 数组数据结构的出现尝试解决这种问题。数组的特性之一就是,以一个名称保存多个相同数据类型的数据。 在这个例子中,我们可以声明一个名为employees_ages的整型数组来保存所有员工的年龄。 数组的第二个特性就是,数组中的每一个数据元素被存储在一段连续的内存空间中,我们可以以索引的方式访问数组的数据元素。 通过遍历数组的索引来访问每个员工的年龄,使得计算员工年龄的平均值变得更加容易;因为在遍历过程中,数组的名称是恒定的,只有索引在变化。 声明一个一维数组 在使用一个数组之前

longAdd

梦想的初衷 提交于 2020-02-12 20:58:21
一、LongAdder简介 https://segmentfault.com/a/1190000015865714 JDK1.8时,java.util.concurrent.atomic包中提供了一个新的原子类:LongAdder。 根据Oracle官方文档的介绍,LongAdder在高并发的场景下会比它的前辈————AtomicLong 具有更好的性能,代价是消耗更多的内存空间: clipboard.png 那么,问题来了: 为什么要引入LongAdder? AtomicLong在高并发的场景下有什么问题吗? 如果低并发环境下,LongAdder和AtomicLong性能差不多,那LongAdder是否就可以替代AtomicLong了? 为什么要引入LongAdder? 我们知道,AtomicLong是利用了底层的CAS操作来提供并发性的,比如addAndGet方法: clipboard.png 上述方法调用了Unsafe类的getAndAddLong方法,该方法是个native方法,它的逻辑是采用自旋的方式不断更新目标值,直到更新成功。 在并发量较低的环境下,线程冲突的概率比较小,自旋的次数不会很多。但是,高并发环境下,N个线程同时进行自旋操作,会出现大量失败并不断自旋的情况,此时AtomicLong的自旋会成为瓶颈。 这就是LongAdder引入的初衷—

Java集合常见面试题

江枫思渺然 提交于 2020-02-12 02:36:28
适可而止,见好就收 来源主要是 牛客 的Java实习面经。下面的回答直接背就可以,需要一定的Java基础,适合春招实习的同学,但是我会在每个问题下把有助于理解的博客贴出来。如果发现有问题欢迎私聊我或留言我会在下面更新 Map 1. Map的底层结构 腾讯19年秋招 这个题乍一看没有什么思路(因为Map是个集合,当然也有可能是我记错了),所以我们可以先介绍一下Map然后转到HashMap中 Map是一种使用键值对存储的集合。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。 在整个Map系列中,AbstractMap抽象类实现了Map,SortedMap接口继承了Map。而我们常用的HashMap,HashTable,TreeMap和ConcurrentHashMap有继承了AbstractMap类。 其中,HashTable和ConcurrentHashMap是线程安全的。前者是通过synchronized实现的,后者是通过AQS实现的。其中要注意HashTable不能存空值,HashMap是线程不安全的,key可以为空。TreeMap通过二叉树算法实现有序集合,它实现了SortedMap接口 2. HashMap的原理 阿里17年实习,小米19年秋招本科,滴滴19年秋招本科,网易19年秋招本科

动态规划( python)

吃可爱长大的小学妹 提交于 2020-02-11 03:55:59
  动态规划的三要素:最优子结构,边界和状态转移函数,最优子结构是指每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到(子问题的最优解能够决定这个问题的最优解),边界指的是问题最小子集的解(初始范围),状态转移函数是指从一个阶段向另一个阶段过度的具体形式,描述的是两个相邻子问题之间的关系(递推式)   重叠子问题,对每个子问题只计算一次,然后将其计算的结果保存到一个表格中,每一次需要上一个子问题解时,进行调用,只要o(1)时间复杂度,准确的说,动态规划是利用空间去换取时间的算法.   判断是否可以利用动态规划求解,第一个是判断是否存在重叠子问题, 例子: 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 示例 2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/23/dynamic-programming

什么是数组?

倾然丶 夕夏残阳落幕 提交于 2020-02-09 23:34:24
今天要介绍的主角就是- 数组 ,数组也是数据呈线性排列的一种数据结构。与前一节中的 链表 不同,在数组中,访问数据十分简单,而添加和删除数据比较耗工夫。这和 什么是数据结构 那篇文章中讲到的姓名按拼音顺序排列的电话簿类似。 数组 如上就是数组的概念图,Blue、Yellow、Red 作为数据存储在数组中,其中 a 是数组的名字,后面 [] 中的数字表示该数据是数组中的第几个数据,该数字也就是 数组下标,下标从 0 开始计数 ,比如 Red 就是数组 a 的第 2 个数据。 那么 为什么许多编程语言中的数组都从 0 开始编号的呢 ?先别急,可以先自己思考下,将会在文末进行讲解。 从图中可以看出来,数组的数据是按 顺序存储 在内存的连续空间内的。 由于数据是存储在连续空间内的,所以每个数据的内存地址(在内存上的位置)都可以通过数组下标算出,我们也就可以借此直接访问目标数据,也就是 随机访问 。 比如现在我们想要访问 Red,如果是链表的话,只能使用指针就只能从头开始查找,但在数组中,只需要指定 a[2],便能直接访问 Red。 但是,如果想在任意位置上添加或者删除数据,数组的操作就要比链表复杂多了。这里我们尝试将 Green 添加到第 2 个位置上。 首先,在数组的末尾确保需要增加的存储空间。 为了给新数据 Green 腾出位置,要把已有数据一个个移开,首先把 Red 往后移。 然后把

神经记忆模型

夙愿已清 提交于 2020-02-07 02:06:07
神经记忆模型 rnn和lstm的记忆能力实在有限,最多也就记忆十几个时间步长。因此当句子长度增长时或者需要添加先验知识时,seq2seq就不能满足此时对话系统的需求了。比起人工增加RNN隐藏状态大小,我们更愿意任意增加加入模型的知识量,同时对模型本身做出最小限度改变。基本上,我们能用独立存储器——作为一种神经网络能够按需读写的知识库——来增强模型。你可以把神经网络视为CPU,而且将这种新的外部存储器视为RAM。 按照facebook ai研究所和google deepmind研究所的进展回顾一下: Facebook AI: 2015年提出MEMORY NETWORKS,使用记忆网络增强记忆。(引用数:475) 2015年提出End-To-End Memory Networks,针对上一篇文章中存在的无法端到端训练的问题,提出了端到端的记忆网络。(引用数:467) 2016年提出Key-Value Memory Networks for Directly Reading Documents,在端到端的基础上增加记忆的规模。(引用数:68) 2017年提出TRACKING THE WORLD STATE WITH RECURRENT ENTITY NETWORKS,论文提出了一种新的动态记忆网络,其使用固定长度的记忆单元来存储世界上的实体,每个记忆单元对应一个实体