数组
在计算机中经常听到程序中有这几种地址类型,这是程序员甚至所有IT工程师容易搞错的事情。 物理地址就是物理内存真正的地址,相当于内存中每个存储单元的门牌号,具有唯一性。不管在什么模式下,不管什么虚拟地址,线性地址,cpu最终都要以物理地址去访问内存,只有物理地址才是内存访问的终点站
在中国象棋里将和帅是不能碰面的,如下图所示,当将位于d10时,帅就不能在d1、d2、d3。请写一个程序,输出将、帅所有的合法位置。要求在代码中仅用一个变量
给定一棵二叉搜索树(BST)的根节点 root,且二叉搜索树的节点值各不相同。要求将其转化为“累加树”,使其每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 二叉搜索树的定义: 若左子树不为空,则左子树上所有节点值均小于它的根节点值; 若右子树不为空,则右子树上所有节点值均大于它的根节点值; 任意节点的左、右子树也分别为二叉搜索树
在ECMAScript 2015中,允许为函数的参数添加默认值,将默认值直接写在参数的后面即可。 值得注意的是:参数变量是默认声明的,所以不能用let或const再次声明 否则会抛出异常。 还有就是默认参数的位置都是在参数列表的最后面,否则会引发歧义,该省略的参数不能省略, 如下代码示例: 参数默认值可以与解构赋值的默认值,结合起来使用
N皇后是一个很经典的题目,我这里使用的是递归的形式来暴力检索所有的情况。 首先我定义了一个board的二维数组做棋盘,并初始化棋盘。根据题目要求,任何两个皇后都不能处于同一条横行、纵行或斜线上,所以我新增了一个判断在i,j点放置皇后是否有效的方法isValid,这个方法是核心,比较难的点在于如何判断左斜线和右斜线的情况
Go 语言为什么建议 append 追加新元素使用原切片变量接收返回值? 在 Go 语言中,切片类型比较常用,将新元素追加到切片也比较常见,因此 Go 语言提供一个内置函数 append,该函数可以非常方便实现此功能。 虽然 Go 语言内置函数 append 使用非常方便,但是使用不当会不小心掉入一些“坑”。 本文我们介绍一下 Go 语言为什么建议 append 追加新元素使用原切片变量接收返回值? 阅读上面这段代码,我们定义一个长度为 0,容量为 5 的 int 类型的切片 a
当我们要排序这样一个数组的时候,归并排序法首先将这个数组分成一半。如图: 然后想办法把左边的数组给排序,右边的数组给排序,之后呢再将它们归并起来。当然了当我们对左边的数组和右边的素组进行排序的时候,再分别将左边的数组和右边的数组分成一半,然后对每一个部分先排序,再归并
勿在浮沙筑高台 练从难处练 用从易处用. 存储的全部是对象 如类的实例、数组等. jvm 只有一个堆区(heap)被所有线程共享 堆中不存放基本类型和对象引用 只存放对象本身. 每个线程包含一个栈区 栈中只保存基础数据类型的对象和自定义对象的引用(不是对象) 对象都存放在堆区中. 每个栈中的数据(原始类型和对象引用)都是私有的 其他栈不能访问. 栈分为3个部分: 基本类型变量区、执行环境上下文、操作指令区(存放操作指令). 又叫静态区 跟堆一样 被所有的线程共享 方法区包含所有的 class 信息、static 变量以及方法主体. 方法区中包含的都是在整个程序中永远唯一的元素 如class 信息、 static变量以及方法主体. 如果当我们大量调用方法时 如递归调用方法 那就可能导致栈溢出; 而当我们生成大量的对象时 就有可能导致堆溢出.
寻找二叉树的下一个节点 已知一个包含父节点引用的二叉树和其中的一个节点,如何找出这个节点中序遍历序列的下一个节点? 本文就跟大家分享下这个问题的解决方案与实现代码,欢迎各位感兴趣的开发者阅读本文。 重建二叉树 给定一颗二叉树的前序遍历和中序遍历的数组,且数组中不包含重复的数字,根据给定的两个数组求出这颗二叉树,这就是重建二叉树问题的定义。 本文将详解重建二叉树问题的解题思路以及其代码实现,欢迎各位感兴趣的开发者阅读本文
当初始化一个类数组的时候,有什么方法可以减少构造和复制操作呢? 对于一个类Foo,我们的目标是构建其数组形式,并希望尽量减少构造和复制。 常规数组访问方式如下: printf("=================1\n"); 将得到以下输出,构造4次,复制2次,十分普通: =================1 得到以下输出,只构造两次,没有复制,满足需求,但是如果数组很大的话,这种形式明显就不太好了: 移除上述Foo array1[2];的默认构造过程,又可以产生以下的代码: 注意到,我们需要手动调用析构,得到以下输出,构造2次,复制2次,已有所优化了: 通过这个问题,我学习到了placement new(以前可能学习过,但是完全忘记了TAT),使用placement new可以再次优化,直接在给定的内存上构造,其原理如何,我认为这些知识点不是我目前想追求的,所以不做讨论。总之,可以得到以下代码: 得到以下输出,只构造2次,没有复制: 上述placement new方案有点不太美观,特别是reinterpret_cast之处,考虑使用allocator分配,得到以下代码: 同样输出如下,只构造2次,没有复制,不过通过内存地址也可以看出,这是堆上分配的: 以上只是针对今天一个问题的解答,placement new或者allocator是否是更优的答案,我认为具体问题还需要具体分析






