数组

LeetCode 945. 使数组唯一的最小增量

余生长醉 提交于 2020-03-23 01:57:44
我的LeetCode刷题源码[GitHub]: https://github.com/izhoujie/Algorithmcii LeetCode 945. 使数组唯一的最小增量 题目 给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。 返回使 A 中的每个值都是唯一的最少操作次数。 示例 1: 输入:[1,2,2] 输出:1 解释:经过一次 move 操作,数组将变为 [1, 2, 3]。 示例 2: 输入:[3,2,1,2,1,7] 输出:6 解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。 可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。 提示: 0 <= A.length <= 40000 0 <= A[i] < 40000 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/minimum-increment-to-make-array-unique 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解题思路 思路1-先排序,再从左向右累加每两个临近数需要的+1操作数; Arrays.sort(A)排序; 顺次比较并记录将后一个数变为前一个数+1数所需要的操作数; 例子

JAVA基础-----数组

ぃ、小莉子 提交于 2020-03-23 01:29:04
数组 数组:是一 个固定长度 的,包含了 相同类型 数据的容器 数组本是一个引用数据类型,数组内存存储的类型可以是基本类型 也可以是引用类型 数组的定义(声明) int[] a; 声明了一个数组变量。 []表示该变量是一个数组 int 表示数组里的每一个元素都是一个整数 a 是变量名 但是,仅仅是这一句声明,不会创建数组 有时候也会写成int a[]; 没有任何区别,就是你看哪种顺眼的问题 public class HelloWorld { public static void main(String[] args) { // 声明一个数组 int[] a; } } 数组的赋值(初始化) 静态初始化(有长度 有元素) public class HelloWorld { public static void main(String[] args) { int[] arry = new int[] {10,20,30,40,50}; int[] arry ={10,20,30,40,50} } 动态初始化(有长度 没元素-->默认值) int[]array -new int[5] 数组元素的访问 通过的元素在数组中的位置来访问 位置---->index索引 索引是有取值范围的 如果数组的索引超出了数组范围 会出现一个运行时异常 ArryIndexOutOfBoundsException

DS博客作业02--栈和队列

旧巷老猫 提交于 2020-03-22 20:11:35
0.PTA得分截图 1.本周学习总结 1.1总结栈和队列内容 栈的顺序存储结构及其基本运算 栈是限制插入和删除只能在一个位置上进行的表,采用顺序存储结构的栈称为顺序栈。 顺序栈的结构体定义: typedef struct { ElemType data[MaxSize] ;//存放栈中的数据元素 int top;//栈顶指针,即存放栈顶元素在data数组中的下标 }SqStack;//顺序栈类型 初始化栈 该运算创建一个空栈,由s指向它。实际上就是分配-一个顺序栈空间,并将栈顶指针设置为-1。 void InitStack(SqStack * &s) { s= (SqStack * )malloc( sizeof(SqStack)); //分配一个顺序栈空间, 首地址存放在s中 s-> top=-1;//栈顶指针置为-1 } 判断栈是否为空 该运算实际上用于判断条件s-> top==-1是否成立。 bool StackEmpty(SqStack *s) { return(s-> top==-1); } 进栈Push(&s,e) 该运算的执行过程是,在栈不满的条件下先将栈顶指针增1,然后在该位置上插人元素e,并返回真;否则返回假。 bool Push(SqStack * &s, ElemType e) { if (s-> top==MaxSize- 1)//栈满的情况,即栈上溢出

es5中数组的迭代方法 forEach,map,filter,some,every

北城余情 提交于 2020-03-22 18:22:37
1.forEach()map()方法 遍历数组 var array = [11,85,69,32,55,66] array.forEach((value,index)=> { console.log(value,index) }); map()和forEach相似,都是遍历 ,不会改变原数组,不会对空数组进行检测 var array = [11,85,69,32,55,66] var newArr=array.map((value)=> { return value*2 }); console.log(newArr) 2.filter过滤器 筛选出需要的数组元素 (所有的) var arr= [11,85,69,32,55,66] var newArr = arr.filter((value)=>{ return value % 2 ===0 }) console.log(newArr) 3.some() map()查找数组中有没有满足条件的数组 返回的是一个布尔值,只要找到第一个满足的元素存在即停止 var arr= [11,85,69,32,55,66] var newArr =arr.some((value)=>{ return value>20 }) console.log(newArr); 只要找到第一个满足的元素存在即停止 (第一个满足的) var colors = [

HashMap中 get(K key) 和 put(K key,V value) 的具体过程

…衆ロ難τιáo~ 提交于 2020-03-22 18:08:21
说在前面 本文包含手写泛型HashMap<K,V>为简化版,仅为理解 HashMap 的 get() 和put() 方法的工作过程,非Java源码。 get(K key) 原理 先计算出key对应的hash值 int hash = key.hashCode(); //此处的 hashCode() 方法为 Object对象 所属方法,默认都有 //自定义的类需要覆写该方法 对超出数组范围的hash值进行处理 hash = (hash >>> 16)^hash;//java内部自做的优化,为了使hash值更加均衡,减少冲突 int index = hash & (table.length - 1);//对下标进行合理化,以免下标越界 //这样做可以使index在数组长度范围内的原因或者一个前提是,这里的数组的长度一定是2的n次方, //这样table.length - 1 在二进制情况下,除最高位,其余低位为一定是1,用hash与这样的一个数进行与操作 //即只保留了hash的二进制的低位,就会使hash的范围一定小于数组长度 根据正确的hash值(下标值)找到所在的链表的头结点 Entry<K,V> node = table[index]; 遍历链表,如果key值相等,返回对应的value值,否则返回null while(node != null){ if(node.key

redis 缓存击穿 3

坚强是说给别人听的谎言 提交于 2020-03-22 17:00:21
什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询,这样缓存就失去了意义。如果在大流量下数据库可能挂掉。这就是缓存击穿。 场景如下图所示: 我们正常人在登录首页的时候,都是根据userID来命中数据,然而黑客的目的是破坏你的系统,黑客可以随机生成一堆userID,然后将这些请求怼到你的服务器上,这些请求在缓存中不存在,就会穿过缓存,直接怼到数据库上,从而造成数据库连接异常。 解决方案 在这里我们给出三套解决方案,大家根据项目中的实际情况,选择使用. 讲下述三种方案前,我们先回忆下redis的setnx方法 SETNX key value 将 key 的值设为 value ,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。 SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。 可用版本 :>= 1.0.0 时间复杂度 : O(1) 返回值 : 设置成功,返回 1。设置失败,返回 0 。 效果如下 redis > EXISTS job # job 不存在 ( integer ) 0 redis > SETNX job "programmer" # job 设置成功 ( integer ) 1

【C#】C#语法基础---转

耗尽温柔 提交于 2020-03-22 16:42:57
一,注释语句 /*注释语句包含在"反斜杠* "和" *反斜杠"中, 或者两个反斜杠和换行符之中, 或者三个反斜杠和换行符之中(可以被VS自动识别为文件注释以提取) 要注意注释中的\,该续行符会把下一行连上来一起注释掉出错。*/ static void Main(string[] args)   {//语句块包含在{}中     int MyInterger;//语句以;结束     string MyString;///忽略空白字符(空格/回车/TAB)     MyInterger = 17;   } //要注意防止注释嵌套出错,可用#if,#endif预处理语句。 二,数据类型 1,基本型/内置型 用户自定义型 A,内置类型:CS使用.net FrameWork ? 库中的数据类型 sbyte = System.SByte,... 类型 字节数 解释 byte 1 无符号字节型 sbyte 1 有符号字节型 short 2 有符号短字节型 ushort 2 无符号短字节型 int 4 有符号整型 uint 4 无符号整型 long 8 有符号长整型 ulong 8 无符号长整型 float 4 浮点数 double 8 双精度数 decimal 8 固定精度数 string ? unicode字串型 char ? unicode字符型 bool ? 真假布尔型/

找出数组中两个只出现一次的数字

别说谁变了你拦得住时间么 提交于 2020-03-22 14:55:04
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字 通过这道题感觉位运算很强大~这道题利用异或的几个性质:任何数与其本身异或值都为0,异或运算满足交换律。因此将一组数依次异或,若里面只有一个只出现一次的数,其他的数都出现两次,则最后的结果必然是那个只出现一次的数。要找到两个数字就可以先通过异或整个数组,将得到的结果分组。然后依次安组异或就可以得到所求的值~ 代码如下: #include<iostream> using namespace std; int findFirstOne(int value); bool testBit(int value,int pos); int findNums(int date[],int length,int &num1,int &num2){ if(length<2){return -1;} int ansXor=0; for(int i=0;i<length;i++){ ansXor^=date[i]; //异或 } int pos=findFirstOne(ansXor); num1=num2=0; for(int i=0;i<length;i++){ if(testBit(date[i],pos)) num1^=date[i]; else num2^=date[i]; } return 0;

页面太卡了?试试这方法呢!

眉间皱痕 提交于 2020-03-22 13:31:41
你写的代码导致浏览器运行奔溃,或页面卡住了,卡死了,怎么办? 你可以试试定时器的一个方法,叫做数组分块。 脚本长时间运行的问题通常由两个原因造成的: 1.过长或过深的函数调用 2.进行大量处理的循环。 长时间循环通常遵循下面模式 for(let i = 0,len = data.length; i < len; i ++) { process(data[i]) } 这个模式的问题在于 要处理的项目的数量在运行前是不可知的,如果要完成process()要花100ms,两个项目的数组可能不会造成影响,但是10个的数组可能要1秒钟,数组中的项目数量直接关系到完成循环的时间长度,由于js的执行是一个阻塞操作,脚本运行所花的时间越久,用户无法与页面交互时间越久。 在循环前有两个问题, 1.该处理是否必须同步完成?(如果这个数据的处理,会造成其他运行的阻塞,那么最好不要动它) 2.数据是否必须按顺序完成?(通常数组只是对项目的组合和迭代的一种简单的方法而无所谓顺序,如果项目顺序不是那么重要,那么可以将某些处理推迟到以后) 当你发现某个循环占用了大量的时间,同时对上述两个问题答案都是否,那么你可以使用定时器分割这个循环。这个技术交数组分块 要实现数组分块非常简单,下面这函数拿去用 function chunk(array,process,context) { setTimeout

945:使数组唯一的最小增量(C++)

自作多情 提交于 2020-03-22 10:57:05
题目地址: https://leetcode-cn.com/problems/minimum-increment-to-make-array-unique/ 题目描述 给定整数数组 A,每次 move 操作将会选择任意A[i],并将其递增 1 。返回使A中的每个值都是唯一的最少操作次数。 题目示例 示例 1: 输入:[1,2,2] 输出:1 解释:经过一次 move 操作,数组将变为 [1, 2, 3]。 示例 2: 输入:[3,2,1,2,1,7] 输出:6 解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。 可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。 提示: 0 <= A.length <= 40000 0 <= A[i] < 40000 解题思路 思路1:第一种思路是用数组统计出每个数出现的次数,然后对于每个重复出现的数,暴力地将它递增,直到它增加到一个没有重复出现的数为止。但这样的方法的时间复杂度较大,可以达到O(n^2) 思路2:另一种思路是首先对拿到的数组排序,然后用变量tmp初始化A[0],用于储存较大值,接下来,从后一个数开始遍历,如果发现后一个数比tmp大,则更新tmp,否则,将当前数A[i]调整为tmp+1所需次数,即tmp+1-A[i] 程序源码 class Solution {