数组

2. 数组

你说的曾经没有我的故事 提交于 2020-03-26 01:57:48
2.1 数组的结构 数组,是一块连续的内存区域,且具有相同类型的数据结构。 说回上一次的图。(图片修改自极客专栏:《数据结构与算法之美》) 这就是数组的一块内存区域。 我们提下上面说的两个特点: 连续内存区域 相同的数据类型 这两个特点有什么好处呢? 我们上次说到,如果我们想要查找一个房间1036(一块数据),我们站在上图中1000的位置,然后有下面两种方式: 从1000走4步,到1004,然后再走4步,到1008,以此类推,最终走到1036(为什么每次都走4步呢,就是由相同的数据类型决定的,数据决定了数据所占空间的大小) 或者我们站在1000处,我们需要到a[9]处,我们在心中估算从1000应该跳多远。我们估算出4步的大概距离,然后计算(9-0)*4+1000=1036,也就是我们需要跳过9个4步的距离就可以达到目的地。 回归到计算机,我们创建一个数组: int[] a = new int[10]; 如上图所示,有10块区域,我们知道房间是连续的,我们的起始位置是1000,每个区域占4个大小,请问最后一块区域的起始地址是多少? 如果以0开始记号,也就是10块区域,分别记号为(0,1,...,9),可以这样计算 最后的地址 = 1000 + i * 4 如果以1开始记号,也就是10块区域,分别记号为(1,2,...,9, 10),可以这样计算 最后的地址 = 1000 + (i-1

day03 【List、Set、数据结构、Collections】

。_饼干妹妹 提交于 2020-03-26 01:56:35
day03 【List、Set、数据结构、Collections】 主要内容 数据结构 List集合 Set集合 Collections 教学目标 [ ] 能够说出List集合特点 [ ] 能够说出常见的数据结构 [ ] 能够说出数组结构特点 [ ] 能够说出栈结构特点 [ ] 能够说出队列结构特点 [ ] 能够说出单向链表结构特点 [ ] 能够说出Set集合的特点 [ ] 能够说出哈希表的特点 [ ] 使用HashSet集合存储自定义元素 [ ] 能够说出可变参数的格式 [ ] 能够使用集合工具类 [ ] 能够使用Comparator比较器进行排序 第一章 数据结构 2.1 数据结构有什么用? 当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类的。好用吗?好用,这就是数据结构的用处,只不过你在不知不觉中使用了。 现实世界的存储,我们使用的工具和建模。每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做到最快的插入,查找,删除,也是在追求更快。 我们java是面向对象的语言,就好似自动档轿车,C语言好似手动档吉普。数据结构呢?是变速箱的工作原理。你完全可以不知道变速箱怎样工作,就把自动档的车子从 A点 开到 B点

最长回文子串问题 O(n)算法 manacher URAL1297 HDU3068

不问归期 提交于 2020-03-26 01:44:39
先来看一道简单的题, ural1297 给定一个1000长度的字符串,求最长回文子串。 看起来很Naive,乱搞一下,O(n^2)都可以解决。 再来看这个题 HDU3068 120个110000长度的字符串,是不是感觉有点困难了?据说后缀数组也要TLE 给出一个O(n)的解决方案 manacher算法 很有趣的利用了回文子串的性质,进行递推更新。 转载自 http://blog.csdn.net/ggggiqnypgjg/article/details/6645824 这里,我介绍一下O(n)回文串处理的一种方法。Manacher算法. 原文地址: http://zhuhongcheng.wordpress.com/2009/08/02/a-simple-linear-time-algorithm-for-finding-longest-palindrome-sub-string/ 其实原文说得是比较清楚的,只是英文的,我这里写一份中文的吧。 首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长。这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文有多长, 这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了。这一点一直是在做回文串问题中时比较烦的地方

关于大数组定义为全局变量和内部变量的一些区别

冷暖自知 提交于 2020-03-25 23:21:51
什么是全局变量和main函数中的变量 在我个人浅显的理解下,我所认为的全局变量就是定义在函数外部,作用于整个代码的变量类型 而定义在函数中的变量就是只作用于该函数内部的变量 这两者除此之外再无区别 当我刷了一段时间的题后~尤其是当我们今天看到dp背包问题的模板题时,我对这两者又有了不一样的认识和感受 情形如下: #include <bits/stdc++.h> using namespace std; int main() { int f[1010][1010], v[1010], w[1010]; int N, V; cin >> N >> V; for(int i = 1;i <= N; i++) cin >> v[i] >> w[i]; for(int i = 1;i <= N; i++) for(int j = 0;j <= V; j++) { f[i][j] = f[i-1][j]; if(j >= w[i]) { f[i][j] = max(f[i][j], f[i-1][j-v[i]]+w[i]); } cout << f[N][V] << endl; return 0; } } 这是一个再简单不过的完全背包的模板题,当这个题在一些在线评测oj中都可以顺利AC !! 但是,当我的这种写法在我本地的IDE(VScode)中运行时

ES6 数组扩展

这一生的挚爱 提交于 2020-03-25 23:21:10
结合扩展运算符使用 function foo(a,b,c){ console.log(a,b,c); } foo(...[1,2,3]);//将数组展开,一一对应 用法: const arr=["cyy",18,["html","css"]]; function info(name,age,hobby){ console.log(`我叫${ name },我今年${ age }岁,我喜欢${ hobby.join("和") }`); } info(arr[0],arr[1],arr[2]); //使用扩展运算符 info(...arr); //使用apply达到类似效果 //1、第一个是对象,如果使用apply方法的函数中有this使用,可以指定对象,改变this的指向 //2、第二个参数是数组 info.apply(null,arr); //Math.max() 求最大值 const arr=[1,11,35,3]; //扩展运算符展开数组 console.log(Math.max(...arr)); //apply展开数组 //方法.apply(this,数组) console.log(Math.max.apply(null,arr)); 使用扩展运算符合并数组 const arr1=[1,2]; const arr2=[3,4]; //合并数组 const narr1=[11

数组的方法

旧巷老猫 提交于 2020-03-25 23:16:59
1: pop 方法 移除数组中的最后一个元素并返回该元素。 var a=[1,2,3,4]; a.pop(); // 打印 4 2: push 方法 将新元素添加到一个数组中,并返回数组的新长度值 。 var a=[1,2,3,4]; a.push(5); // 打印 [1,2,3,4,5] 3: shift 方法 移除数组中的第一个元素并返回该元素。 var a=[1,2]; a.shift(); //打印 1 来源: https://www.cnblogs.com/yixiongqiang/p/12570747.html

ES6 函数扩展

ぐ巨炮叔叔 提交于 2020-03-25 21:20:54
函数扩展之默认参数 { function add(a,b=99){ console.log(a,b); } add(1);//1 99 //参数b可以读取到之前的参数a function add2(a,b=99+a){ console.log(a,b); } add2(1);//1 100 //参数b不能读取到自身参数b function add3(a,b=99+b){ console.log(a,b); } add3(1);//报错 //参数b不能读取到之后的参数c function add4(a,b=99+c,c=2){ console.log(a,b); } add4(1);//报错 } 默认参数结合解构赋值 { function Person({name,age=18}={}){ console.log(name,age); } Person();//undefined 18 function Person2({name,age=18}={name:"cyy"}){ console.log(name,age); } Person2();//cyy 18 function Person3({name,age=18}={name:"cyy"}){ console.log(name,age); } Person3({name:"cyy2"});//cyy2 18 }

《剑指offer》——替换空格

我与影子孤独终老i 提交于 2020-03-25 19:26:49
题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 分析:这道题如果允许开辟一个新的数组,我们只需要从头开始扫描原数组中的每个字符, 1)若字符非空格则复制字符到新数组中, 2)若字符为空格则在新数组中填充“%”,“2”,”0”三个字符, 3)继续扫描重复以上操作。 难点在于如果不允许开辟新的数组空间,替换发生在原数组上,我们要做的是将1个字符替换为3个字符,且替换位置后面的字符不能被覆盖。下面我们以题目中的例子看一下字符串在内存中的存储,每个格子存储一个字符 1 W e a r e h a p p y . \0 2 W e % 2 0 a r e h a p p y . \0 3 W e % 2 0 a r t % 2 0 h a p p y . \0 第一行代表原字符串,后面两行代表两次替换操作完成整个字符串的替换,其中2在1的基础上以红色字体为基准后面的字符都向后移动2位,3在2的基础上以红色字体为基准后面的字符又都向后移动2位,而相对于1移动了4位。 初级想法:1)从头开始扫描数组,遇到空格,先将空格后面的字符做依次向后移动2位操作,然后填充"%","2","0",三个字符,记下填充后的下一个位置, 2)从这个位置接着扫描字符串,遇到空格做和上面同样的操作; 3

ufunc函数

自闭症网瘾萝莉.ら 提交于 2020-03-25 15:27:55
  无灯可看。雨水从教正月半。探茧推盘。探得千秋字字看。   铜驼故老。说著宣和似天宝。五百年前。曾向杭州看上元。   ufunc是universal function的缩写,他是一种对数组的每个元素进行运算的函数。NumPy的内置许多函数都是用C语言实现的因此,他们的计算速度十分的快。 >>> x = np.linspace(0,2*np.pi,10) >>> x array([ 0. , 0.6981317 , 1.3962634 , 2.0943951 , 2.7925268 , 3.4906585 , 4.1887902 , 4.88692191, 5.58505361, 6.28318531]) >>> y = np.sin(x) >>> y array([ 0.00000000e+00, 6.42787610e-01, 9.84807753e-01, 8.66025404e-01, 3.42020143e-01, -3.42020143e-01, -8.66025404e-01, -9.84807753e-01, -6.42787610e-01, -2.44929360e-16])   可以查看函数的使用方法,得到使用方法。   下面我们比较一下np.sin()和math.sin()的时间复杂度。 #coding:utf-8 import math import

小沈的C++学习7——指针

[亡魂溺海] 提交于 2020-03-25 15:00:59
  这节课终于学到指针了,话说感觉我是不是在前面几篇博客已经用过不少次这玩意了。但是指针到底是个什么东西呢?今天就让我们来学习指针这个东西。   首先我们小学一年级就学过,电脑里面有内存这个东西,就是利用电位高低存储各种数据,然后可以让cpu各种调用的小容器,而各种数据就听从程序的指挥,在一个个小格子里落户,这个格子就是内存地址。这个时候如果一个函数内部运行的时候在内存上留下了一串数据,它想把这一串数据都交给主函数,那它就可以直接把某个小格子的位置告诉主程序,主程序就可以利用这个位置信息直接到内存里去找这个函数留下来的数据。而这个位置信息就是指针。   首先我们要知道,指针本身也是一种数据,意思就是我们拿到一个指针,到指针指的位置上拿到一个数据,可能也是一个指针。   有了指针,我们甚至可以自己创造一个数据类型。比如我们所有函数都遵循这样一个约定:返回一个指针,指针指向一个指针数组,指针数组的一个指针指向一个数字,代表这个数据的长度或者内存长度,第二个指针指向另一个数字数组,代表这个数据里面每个数据的数据类型,第三个及之后的指针则指向各个数据。这个数据类型是不是很熟悉?没错,只要我们愿意,我们也可以手作一个列表。并且由于指针可以指向指针,这个列表可以不断嵌套(禁止禁止套娃)。 一、指针定义和运算 首先既然我们有了地址,那我们也要知道地址的数据有多长,是个什么类型的数据