sum

数组中只出现一次的数字 --剑指offer

大憨熊 提交于 2020-03-08 22:05:47
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 思路: 链接: https://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811 来源:牛客网 首先:位运算中异或的性质: 两个相同数字异或=0 , 一个数和0异或还是它本身 。 当 只有一个数出现一次 时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了。 依照这个思路,我们来看两个数(我们假设是AB)出现一次的数组。我们首先还是先异或,剩下的数字肯定是A、B异或的结果, 这个结果的二进制中的1,表现的是A和B的不同的位 。我们就取第一个1所在的位数,假设是第3位,接着把原数组分成 两组 ,分组标准是第3位是否为1。如此, 相同的数肯定在一个组 ,因为相同数字所有位都相同,而不同的数, 肯定不在一组 。然后把这两个组按照最开始的思路,依次异或,剩余的两个结果就是这两个只出现一次的数字。 我的代码 public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { int sum=0; for(int i =0;i < array

P5958 【[POI2017]Sabotaż】

时光毁灭记忆、已成空白 提交于 2020-03-08 16:47:46
P5958 【[POI2017]Sabotaż】 题意描述 在一棵以1号节点为根节点的树上,有很多 纯洁的 白点, BUT,突然有一个黑点出现(可能在任意位置) 它要染黑尽可能多的节点,而在一棵子树中, 只有当黑点的比例 \(>x\) 才可以染黑根节点(即整棵子树) 求x的最小值,使得整棵树中被染黑的节点数不超过 \(k\) 个 如果你看不懂请走 传送门 算法分析 一道很裸的树形DP,但思路很巧 显然本题有以下性质: 最坏情况下,最开始的叛徒是叶子结点 因为一个节点被染黑了,一起为根节点的子树将全黑,所以最终被染黑的一定是一颗子树 先设计状态: \(f(i)\) 表示使得 \(i\) 不变黑的最小 \(x\) 易得: \(f(i)\) 也是使得 \(i\) 变黑的最大 \(x\) 可知 \(f(i)\) 仅与 \(f(son{i})\) 以及 \(soni\) 的大小有关(这里的 \(soni\) 表示 \(i\) 的子节点) 那么我们用 \(sum(i)\) 表示 以 \(i\) 为根节点的子树的大小 , \(sum(i)\) 是需要提前用dfs预处理的 显然 \(i\) 被染黑仅必须满足以下两种情况: \(f(soni)<=x\) ,即 \(i\) 的某棵子树被染黑 \(sum(soni)/(sum(i)-1)<=x\) ,即 \(soni\) 的被染黑足以导致 \(i\)

二叉树 | 从根到叶节点

孤街醉人 提交于 2020-03-08 12:55:10
文章目录 问题:路径总和 解题思路 C++代码 问题:求根到叶子节点数字之和 解题思路 C++代码 问题:路径总和 问题链接 解题思路 采用递归的思路 root为NULL返回false root为叶节点时判断节点值和sum是否相等 root有孩子时,对有孩子的分支进行判断对结果进行逻辑或运算 C++代码 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public : bool hasPathSum ( TreeNode * root , int sum ) { if ( ! root ) return false ; //NULL返回false if ( ! root - > left && ! root - > right ) return root - > val == sum ; //root是根节点 //root有孩子节点 bool flag = false ; if ( root - > left ) flag = flag ||

集合和集合操作

和自甴很熟 提交于 2020-03-08 05:39:34
集合 ArrayList //集合 ArrayList类 //集合是一组可变数量的元素组合 一般来说 这些元素的类型是相同的 只能是一维的 //初始化 //ArrayList al = new ArrayList(); //添加元素到集合的最后 //al.Add(1); //al.Add(2); //al.Add(2); //al.Add(4); //Console.WriteLine(al[1]); ////插入 在某个索引号处插入某个值 插入之后索引号的原值被顶到下一索引号去 以此类推 //al.Insert(1,9);//object是所有类的基类,可以放所有类 //Console.Write(al[1]); //al.Remove(2);//括号里放的是移除的值 只移除从前往后的第一个值 //al.RemoveAt(2);//括号里放的是移除值的索引号 //遍历集合 //foreach (object a in al) //{ // Console.WriteLine(a); //} //定义个数接收 //int geshu = al.Count; //清空集合 //al.Clear(); //判断是否包含某个值 //bool b = al.Contains(3); //自动排序 升序 //al.Sort(); //将集合翻转 //al.Reverse();/

c++语法之为什么有函数重载,如何使用

落爺英雄遲暮 提交于 2020-03-08 03:00:30
为什么要使用函数重载 先附上我 立知的结果 。 1、减少对用户的复杂性。 2、这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。 作用一:减少对用户的复杂性 这点是很好理解的,为了方便开发,若具有相同功能但针对类型不同的函数过多,就会导致编程人员存在过多的时空花销。但是针对用户,我就也不太清楚了。 作用二 列出一下几个求和函数: sum(int a,int b) //不写返回类型,返回整型 double sum(double a,double b) float sum(floata,float b,float c) 针对下面的语句是不同的调用 int x=sum(2,8); float y=sum(5.6,11.1); float z=sum(float(x),y,5); 顺带就说下 重载函数的要求 : 当调用到重载函数时,编译器根据实参的类型对应地调用相应的函数。匹配过程按如下步骤进行: (1)如果有参数严格匹配(参数个数、类型完全一致)的函数,就调用该函数; (2

Fasttext (Bag of Tricks for Efficient Text Classification) 阅读笔记

我是研究僧i 提交于 2020-03-08 02:57:40
论文原文 Bag of Tricks for Efficient Text Classification 论文信息 EACL2017 论文解读 Hytn Chen 更新时间 2020-02-23 文本分类相关方法 用作文本分类的卷积神经网络,有多个使用流程示意图如下 1维卷积 堆卷积(Goldberg Book) 延迟CNN(Kalchbrenner et al. 2016) 动态CNN 详见这篇文章解读 总结一下,CNN在文本分类中担任的主要角色就是encoding文本,之后可以用分类器解决分类的问题。CNN主要问题就是训练相对较慢,从而就限制了CNN不能在非常大的数据集上使用。 论文提出的模型 模型结构图如下 简单来讲就是 文本表征+线性模型 ,这里的文本表征由n-gram,词查找表以及CBOW组成,线性模型由多层softmax和rank constraint组成(实现参数共享的效果)。 输入层 :先看n-gram表征,很简单理解,假设一句话有N个词,1-gram就是单个词为一组,一共可以有N组;2-gram就是两个词为一组的排列组合,一共可以有 N ( N − 1 ) 2 \frac{N(N-1)}{2} 2 N ( N − 1 ) ​ 组,如果再多那字典(要索引到具体组别,一个组别一个序号)的维度就呈指数增长了,因此文中使用了哈希字典的方式来避免这样的情况发生(把所有的n

7人表决器的实现之路

放肆的年华 提交于 2020-03-08 02:41:32
感觉已经好久没有更新了(毕竟好久也没玩FPGA了,小声逼逼😂),手也有点生疏,各个软件的操作也有些忘记了。看来每天打开一下Quartus II, ModelSim, SignalTap II, UltraEdit 很有必要!(就算不用,也要打开一下熟悉界面嘛) 这次不是将具体原理的实现,而是记录一下遇到的问题(因为有些东西我也不是太清楚!) 首先我先给出仿真Test Bench文件(之后的遇到的问题基本与此无关),从里面的注释可以发现,还是遇到很多困难的,毕竟这个文件是自己一行一行敲的,肯定存在了一些问题! 下图是整个实验的思路导图! 一、唯一的一次成功情形 for语句中使用非阻塞赋值,在always块的结尾将sum清零! 可以发现:在112ns~116ns中,4ns经历了一次vote信号的变化(详请查看仿真文件),并且针对我们vote信号中"1"的个数给出相应的pass信号。 二、 这里,我们先将最后的sum清零注释掉,此时与书中(《自己动手写CPU》)的原始代码基本一致。问题是:我们的 i 恒为7,sum一直处于 未知态。 三、 基于 二 ,我们猜想可能是for循环中的初始赋值语句只执行一次。于是就将 i= 0; 置于for语句前面。 但依然没有什么用:我们的 i 恒为7,sum一直处于 未知态 四、 基于 二,我们将always块中的非阻塞赋值 全部替换成 阻塞赋值。

分支合并-forkjoin

一曲冷凌霜 提交于 2020-03-07 17:40:20
1.分支合并-forkjoin ForkJoin的框架的基本思想是分而治之。什么是分而治之?分而治之就是将一个复杂的计算,按照设定的阈值进行分解成多个计算,然后将各个计算结果进行汇总。相应的ForkJoin将复杂的计算当做一个任务。而分解的多个计算则是当做一个子任务。 Fork/Join与传统线程池的区别! Fork/Join采用“工作窃取模式”,当执行新的任务时他可以将其拆分成更小的任务执行,并将小任务加到线程队列中,然后再从一个随即线程中偷一个并把它加入自己的队列中。 就比如两个CPU上有不同的任务,这时候A已经执行完,B还有任务等待执行,这时候A就会将B队尾的任务偷过来,加入自己的队列中,对于传统的线程,ForkJoin更有效的利用的CPU资源! 测试forkjoin package com.coding.forkjoin; ​ import java.util.concurrent.RecursiveTask; ​ // 求和 public class ForkJoinWork extends RecursiveTask<Long> { ​ private Long start; private Long end; private static final Long tempLong = 10000L; // 临界值 ​ public ForkJoinWork(Long

pat乙级

﹥>﹥吖頭↗ 提交于 2020-03-07 02:07:12
1081. 检查密码 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点".",还必须既有字母也有数字。 输入格式: 输入第一行给出一个正整数 N(<=100),随后 N 行,每行给出一个用户设置的密码,为不超过80个字符的非空字符串,以回车结束。 输出格式: 对每个用户的密码,在一行中输出系统反馈信息,分以下5种: 如果密码合法,输出“Your password is wan mei.”; 如果密码太短,不论合法与否,都输出“Your password is tai duan le.”; 如果密码长度合法,但存在不合法字符,则输出“Your password is tai luan le.”; 如果密码长度合法,但只有字母没有数字,则输出“Your password needs shu zi.”; 如果密码长度合法,但只有数字没有字母,则输出“Your password needs zi mu.”。 输入样例: 5 123s zheshi.wodepw 1234.5678 WanMei23333 pass*word.6 输出样例: Your

404左叶子之和

喜欢而已 提交于 2020-03-06 18:54:40
题目描述 计算给定二叉树的所有左叶子之和。 思路分析 递归终止的条件是什么?一次递归中要进行什么操作?递归想要返回什么信息? 基于前序递归模板。 终止条件:节点为空 递归中操作:为左叶节点时,将节点值计入sum 可以用基础的前序模板,定义全局变量sum; 也可以将前序模板返回值改成int,则递归想要返回信息就是 左右子树的左叶节点和 + 当前左叶节点和。 代码实现 private int sum = 0 ; public int sumOfLeftLeaves ( TreeNode root ) { if ( root == null ) { return 0 ; } process ( root , false ) ; return sum ; } public void process ( TreeNode root , boolean flag ) { if ( root == null ) { return ; } if ( flag && root . left == null && root . right == null ) { sum += root . val ; } process ( root . left , true ) ; process ( root . right , false ) ; } public static int process (