数据结构与算法
jeanphorn
这个作者很懒,什么都没留下…
展开
-
子集和问题
问题描述子集和问题的一个实力为。其中,S= { w1,w2,w3,...wn}是一个正整数的集合,c是一个正整数。判定是否存在S的一个子集S1使得S1的和为c。输入:输入含多组测试用例!对每组测试用例,第一行有两个正整数n和c,n表示S的大小,c是子集和的目标值。接下来的一行,有n个正整数(1输出输出子集和问题的全部解,每个数据后面都有一个空格。当问题无解时,输出“No S原创 2015-01-18 21:48:24 · 1265 阅读 · 0 评论 -
360笔试题 找老乡
1. 问题描述 大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是一件多么激动的事。于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小妮尤其热衷。但是大家不告诉他来自哪里,只是说谁是同乡,从所给的信息中你能告诉有多少人是小妮的同乡吗?2. 输入 每个测试实例首先包括两个整数N(1≤N≤10001 \le N \le 1000), M(0≤M≤N∗(n−1)/20原创 2015-10-29 17:31:30 · 2291 阅读 · 0 评论 -
删除链表中所有值为k的节点
1. 问题描述 给定一个单链表,删除其中值为k的所有节点。例如:1→2→6→3→4→5→61 \to 2 \to 6 \to 3 \to 4 \to 5 \to 6,删除其中值为6的节点,返回:1→2→3→4→51 \to 2 \to 3 \to 4 \to 5 。2. 方法与思路 这是一个简单的链表操作题。删除是要考虑的节点所在的位置(头部,中间和尾部),分开处理一下好了。主要过程如下描述:原创 2015-07-24 11:28:30 · 4108 阅读 · 0 评论 -
查找两个链表的交叉节点
1. 问题描述 给定两个单链表,查找这两个单链表的交叉节点。例如:链表listA为:a1→a2→c1→c2→c3a_1 \to a_2 \to c_1 \to c_2 \to c_3,链表listB为:b1→b2→b3→c1→c2→c3b_1 \to b_2 \to b_3 \to c_1 \to c_2 \to c_3。那么这两个的第一个交叉节点为c1c_1。2. 方法与思路 首先,观察一下交原创 2015-08-04 09:37:49 · 6552 阅读 · 2 评论 -
删除链表中倒数第k个节点
1. 问题描述 给定一个单链表,删除它的倒数第k个节点。例如给定链表: 1→2→3→4→51\to 2 \to 3\to 4 \to 5,删除它的倒数第二个节点后变为 1→2→3→51\to 2 \to 3\to 5。可以假设倒数第k个节点总是存在。2. 方法与思路 很容易想到第一种方法,就是先对单链表进行进行一次遍历,求出其长度n。然后再进行第二次遍历,设一个指针,向后移动n−kn-k个位置,原创 2015-07-20 15:54:14 · 5598 阅读 · 0 评论 -
c++ 实现atoi()函数
1. 问题描述 实现c++函数库中atoi()函数,要考虑到各种特殊情况: 空字符串。+和-号。字符串前中后n个空格。溢出。非数字字符。2. 解决方案 转换过程并不复杂,复杂的是要考虑到众多特殊情况。int myAtoi(string str) { if(str.length() == 0) return 0; //空串 bool isNeg =原创 2015-07-15 19:37:46 · 6630 阅读 · 1 评论 -
求连续数组中唯一重复的元素
1. 问题描述 数组a[n],1到n-1这n-1个数放在这个数组中,其中有一个数重复一次。写一个算法找出这个数来。2. 方法与思路2.1 累加和法 采用数学求和的方法,由于数组中只有一个数是重复的,且又是连续的,根据累加和原理,对数组求和然后减去1到n-1的和即为所求的重复数。 int OnlyRepeat_Sum(int a[],int len){ int i,re = 0;原创 2015-06-15 10:49:18 · 8624 阅读 · 2 评论 -
旋转数组
1. 问题描述 从右侧旋转一个n个元素的数组,旋转k位。例如:n=7,k=3n = 7, k=3, arr=[1,2,3,4,5,6,7]arr=[1,2,3,4,5,6,7]旋转成为arr=[5,6,7,1,2,3,4]arr=[5,6,7,1,2,3,4]。2. 方法与思路 其实这个问题类似于字符串逆置问题中的句子逆置。比如“hello world”逆置成”world hello”。解决这种原创 2015-07-25 11:01:04 · 4135 阅读 · 0 评论 -
求数组中重复次数最多的元素
1.问题描述 例如:数组a={2,3,1,5,5,5,5,7,8,1},元素2、3、7、8各出现1次,1出现两次,5出现4次,则重复次数最多的元素为5.2. 方法与思路2.1 以空间换时间,索引法 定义一个数组int cnt[MAX],将其元素全部初始化为0。然后遍历数组a,执行cnt[a[i]]++操作。最后在cnt数组中找最大的数,对应的数即为重复次数最多的数。 代码示例如下:原创 2015-06-08 21:32:05 · 16391 阅读 · 4 评论 -
求两个有序整型数组的交集
1. 问题描述 有两个有序的整型数组a和b(没有重复元素),他们的长度分别为lenA和lenB,求出他们的共同元素。 例如:a = 0,1,3,5,7,9,11;b = 2,3,4,7,11; 它们的交集为{3,7,11}。2. 方法思路 求交集的方法有很多种,但数组的长度会影响算法的效率。2.1 长度相当时,可采取的算法2.1.1 二路归并 对于数组a,b分别以i,j从头遍历数组原创 2015-06-06 22:55:58 · 15522 阅读 · 2 评论 -
二分法计算有序数组中数字出现的次数
1. 问题描述 在给定的一个已经排好序的数组中,找出指定数字出现的次数。例如数组[1,2,3,4,4,4,4,6,8,9]中4出现的次数为4次。2. 思路与方法 此问题可以在二分法的基础上进行改进。假设数组a为递增的数列,需要查找的数字为num,可以分别查找num在数组a中出现的起始位置和最后一次的位置,通过二者的差计算出数字num在数组a中出现的次数。 c++代码如下:#include原创 2015-06-03 21:12:09 · 11117 阅读 · 1 评论 -
找出数组a[]中符合a[i]+a[j]=K的数对
1.问题描述 在一个整数数组中,元素都为整数,没有重复数。设计一个算法找出满足两个数的和等于k值得数对。例如a[]={1,3,8,6,4}中两个数的和为7的数对为(1,6)和(3,4)。2. 解决方案2.1 暴力法 首先先到的可能就是暴力法,暴力没举出所有的数对然后再判对他们的和是否为K,但这种方法的时间复杂度为O(n^2),效率比较低,一般不可取。代码也就不写了。、2.2 二分法 先对数组进原创 2015-06-19 19:18:11 · 10613 阅读 · 0 评论 -
C++ STL算法之accumulate函数
1. 介绍 用来计算特定范围内(包括连续的部分和初始值)所有元素的和,除此之外,还可以用指定的二进制操作来计算特定范围内的元素结果。其头文件在numeric中。 accumulate原函数声明定义如下: template<class InputIterator, class Type> Type accumulate( InputIterator _First,原创 2015-04-18 16:22:16 · 34377 阅读 · 3 评论 -
找出两个int型变量的最大值和最小值,不使用if/:?/switch判断语句
方法一:Max=(a+b+|a-b|)/2;Max=(a+b-|a-b|)/2;方法二:通过加减运算和移位运算相结合Min = a+(((b-a)>>31)&(b-a));Max = a-(((a-b)>>31)&(a-b));原创 2014-12-30 12:41:59 · 2046 阅读 · 0 评论 -
Leetcode 297 Serialize and Deserialize Binary Tree(序列化与反序列化二叉树)
1. 描述 设计一个算法,实现二叉树的序列化与反序列化。如何实现没有限制,只要保证一颗二叉树可以序列化为一个string串,然后这个string串可以反序列化为原来的二叉树即可。详细描述如下: 2. 方法与思路 采用先序遍历的思路,为了保证重构二叉树时,节点能够插入到数中的正确位置,空节点用“#”保存。为了保证从字符串中读取节点值方便,节点的值在字符串中用空格分开。重构时依旧安装先序的思想原创 2015-10-30 11:07:08 · 3499 阅读 · 0 评论