
算法
luyuncsd123
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
背包算法(贪婪算法)
一、问题描述:有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?二、总体思路:根据动态规划解题步骤(问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问题的递推关系式、填表、寻找解组成)找出01背包问题的最优解以及解组成,然后编写代码实现;三、动态规划的原理及过程: eg:number=4,capacity=8 i 1 2 3原创 2020-10-28 01:34:00 · 2299 阅读 · 0 评论 -
给定一个排序数组,如何构造一个二叉排序树?
给定一个排序数组,如何构造一个二叉排序树?采用递归算法。选取数组中间的一个元素作为根节点,左边的元素构造左子树,右边的节点构造有子树。原创 2014-07-21 23:58:54 · 7145 阅读 · 0 评论 -
线程和进程区别和联系。什么是“线程安全”?
线程和进程区别和联系。什么是“线程安全”? (1)如果说,在操作系统中引入进程的目的,是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量。那么,在操作系统中再引入线程,则是为了减少程序在并发执行时所付出的空间开销,使OS具有更好的并发性。进程是作为拥有系统资源的基本单位,同时也是一个可独立调度和分派的基本单位(线程也是)。通常进程包含多个线程并为它们提供资源(2)线程安全原创 2014-07-21 20:23:18 · 1229 阅读 · 0 评论 -
atoi
int my_atoi(char* pstr) { int Ret_Integer = 0; int Integer_sign = 1; if(pstr == NULL) //判断指针是否为空 { printf("Pointer is NULL\n"); return原创 2014-07-21 20:03:59 · 745 阅读 · 1 评论 -
Linux下进程通信的八种方法
Linux下进程通信的八种方法Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量(semaphore),信号(signal),套接字(Socket) (1) 管道(pipe):管道允许一个进程和另一个与它有共同祖先的进程之间原创 2014-07-21 20:18:51 · 917 阅读 · 0 评论 -
二进制中1的个数
二进制中1的个数统计二进制中1的个数可以直接移位再判断,当然像《编程之美》书中用循环移位计数或先打一个表再计算都可以。本文详细讲解一种高效的方法。以34520为例,可以通过下面四步来计算其二进制中1的个数二进制中1的个数。第一步:每2位为一组,组内高低位相加 10 00 01 10 11 01 10 00 -->01 00 01 01 10 01 01 00原创 2014-07-20 21:46:43 · 709 阅读 · 0 评论 -
将整形转化为字符串
/*将整形转化为字符串*/#include #include void main(){void IntegerToString(char s[],int n);char str[10];int i=357;IntegerToString(str,i);printf("%s\n",str);}void reverse(char s[])原创 2014-07-19 20:32:24 · 2361 阅读 · 0 评论 -
虚函数
9、下列关于虚函数的说法正确的是()A、在构造函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效。B、在析构函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效。C、静态函数不可以是虚函数因为静态成员函数没有this,也就没有存放vptr的地方,同时其函数的指针存放也不同于一般的成员函数,其无法成为一个对象的虚函数的指针以实现由此带来的动态机制。静态是编译时期就必须确定的,虚原创 2014-07-19 10:56:45 · 1266 阅读 · 0 评论 -
求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,
题目:求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间杂度。 思路一:计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。情况B: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者。首先算原创 2014-07-19 00:14:55 · 2365 阅读 · 0 评论 -
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。 这道题的基本思路就是在第一个字符串中拿到一个字符,在第二个字符串中查找一下,看它是不是在第二个字符串中。如果在的话,就从第一个字符串中删除。 首原创 2014-07-18 22:22:28 · 4971 阅读 · 0 评论 -
二元树的深度(树)
二元树的深度(树)题目:输入一棵二元树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如:输入二元树: 10 / /原创 2014-07-18 23:46:10 · 920 阅读 · 0 评论 -
16进制字符串转化为10进制数(k_eckel转自微软高校博客K_eckel's mindview)
16进制字符串转化为10进制数(k_eckel转自微软高校博客K_eckel's mindview)16进制字符串转化为10进制数 k_eckel:http://www.mscenter.edu.cn/blog/k_eckel 同学在MSN CDC电话面试(可惜我在被面试的时候全然没有这么具体的问题了:))中的一个题目:将16进制的字符串转化为10进制数字原创 2014-07-18 18:44:05 · 905 阅读 · 0 评论 -
国外大学面试题
标签:美国留学朱培刚sat培训分类: 美国留学Harvard:(7女5男) 北京5人(其中一人off waitlist),南京2人(我的博客中曾专门介绍"庆祝南外刘天宇同学收到哈佛录取通知书及个人思考"),上海2人(其中一人off waitlist),哈尔滨1人,成都1人,潍坊1人(我的博文曾专门介绍"潍坊一中曾小雨以全额奖学金被哈佛录取 从普高进哈转载 2014-07-18 17:36:12 · 4421 阅读 · 0 评论 -
一个岔路口分别通向诚实国和说谎国。
假设这两个人分别简称甲和乙。情况一问题1问甲:乙是来自说谎国的对吧?如甲是说谎国的他只会说谎,甲不能回答正确答案乙是来自诚实国他必然回答“乙是来自诚实国”。问题2问甲:乙是来自诚实国对吧?如甲是说谎国的他只会说谎,那他在明知乙是诚实国人的情况下也回答“乙是来自说谎国”。经过前两个问题分析甲的回答前后矛盾,可知道甲在说谎,甲来自说谎国。问题3问甲:哪边的岔道口通向说谎国?转载 2014-07-18 17:07:37 · 2557 阅读 · 1 评论 -
数组中是否有两个数的和为10 一道小题做四方
数组中是否有两个数的和为101.比较任意两个数的和是否为10。如for (int i = 0; i 复杂度为O(n*n)。 2.将数组排序后,对每个数m,使用二分查找在数组中寻找10-m。复杂度为O(nlogn)。 3.将数组存储到hash_set中去,对每个数m,在hash_set中寻找10-m。复杂度为O(n)。 4.如果数组很大,超原创 2014-07-21 23:57:17 · 998 阅读 · 0 评论 -
在一个无序整型数组中找出第k小的数字
问题描述:在一个无序整型数组中找出第k小的数字:示例:数组[16, 105, 3, 31, 61, 50, 61, 80, 78, 49] 结果 k=50算法:分治算法+快速排序思路:如果在递增有序的数组中,第k小的数字必然在k-1位置上。而对于初始无序的数组,快速排序在每次排序完成后,在枢纽值(哨兵/pivot)左边的值会永远在其左边,而在其右边的值永远会在其右边,那们根转载 2014-06-08 23:08:45 · 5382 阅读 · 1 评论 -
翻转链表
最近试着做一些笔试面试题,既是为来年找工作做准备,也可以做为数据结构和算法的复习笔记,就陆续发在这里吧,有需要的朋友可以看一下,如果有没考虑周全的地方欢迎指正。 先来一个最常见的题目:反转单链表。假设单链表的数据结构定义如下: ?typedefstruct LNode{ int data; structL原创 2014-07-22 00:44:32 · 733 阅读 · 0 评论 -
用递归和非递归两种方法翻转一个链表
用递归和非递归两种方法翻转一个链表先定义一下链表:[cpp] view plaincopyprint?typedef struct node { ElemType data; struct node * next; }ListNode; typedef struct { ListNode *head; int size; ListNode *t原创 2014-07-29 09:57:01 · 1076 阅读 · 0 评论 -
广搜和深搜
一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的特点是"搜到就是最优解", 而深搜用于找多个解或者是"步数已知(好比3步就必需达到前提)"的标题,它的空间效率高,然则找到的不必定是最优解,必需记实并完成全数搜索,故一般情况下,深搜需要很是高效的剪枝(优化).像搜索最短路径这些的很显著若是用广搜,因为广搜的特征就是一层一层往下搜的,保证当前搜到的都是最优解,当然,最短路径只原创 2014-07-28 22:22:37 · 1565 阅读 · 0 评论 -
12 个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个
把12个球分别编号,随意分成3组。分别为: (1、2、3、4)为①组;(A、B、C、D)为②组;(5、6、7、8)为③组. 第一次:把①与②组放天平称。有两种情况:一是平;二是不平,(如不平,记住重的一组,这并不能说明异常球重还是轻)。 一、IF平:则异常球在③组。 在③组球中任选2个,不妨选(5、6),与正常球(1、2)号球进行第二次称。有两种情况:一是平;二是不平。 1原创 2014-07-18 16:54:04 · 1520 阅读 · 0 评论 -
对一个字符数组进行全排列
#include #include void swapArrayElements(char a[], int lhs, int rhs){ char temp; temp = a[lhs]; a[lhs] = a[rhs]; a[rhs] = temp;}void perm(char a[], int start, int end原创 2014-07-29 11:13:34 · 1393 阅读 · 0 评论 -
2个有序数组 第K小
前言:这道题是一道非常常见的面试题,也是一道能够考察一个人的编程能力和算法的一道题。如果要求复杂度为 O(k), 是比较容易做出来的,但是,一般来讲,面试官要求给出更低复杂度的算法。网上有很多不同的解法,但是,总的来讲,那些程序考虑的因素太多,比较难懂,而且结构很乱。在这里写出自己的方法。本文的算法复杂度为 O(lg K)。 PS. 如果你没有见过这个题目,并且能够在30分钟内写出没有bu转载 2014-07-27 19:36:50 · 785 阅读 · 0 评论 -
查找最小的k个元素(数组)
题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。1 在数据量不大的情况下,排序2 维护一个最小k 的数组 ,复杂度 为 o(k * N) 3 为一个最小K个数的最大堆 o(log2 k * N)/*查找最小的k 个元素题目:输入n 个整数,输出其中最小的k 个。例如输入1,2,3,4,5,6,7原创 2014-07-27 23:43:13 · 1326 阅读 · 0 评论 -
动态规划【搬运距离】
算法stringclass2010c 一个骆驮运玉米从A地到B地, 骆驮一次最多运1000个玉米,A地距离B地有1000米远. 而骆驮每走1米就要吃一个玉米.现在有3000个玉米.现在要从A运到B. 问到B地最多还能剩下多少个玉米?wantalcs给出的答案是: [c-sharp] view plaincopyprint?class Program原创 2014-07-27 21:00:57 · 1262 阅读 · 0 评论 -
冒泡排序
sharp] view plaincopyprint?class BubbleSortAlgorithm { public void BubbleSort(int[] array) { bool exchanged = false; // to check whether the array is sorted.原创 2014-07-27 21:23:55 · 908 阅读 · 0 评论 -
A*寻路算法
你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢?如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它!在网上已经有很多篇关于A星寻路算法的文章,但是大部分都是提供给已经了解基本原理的高级开发者的。本篇教程将从最基本的原理讲起。我们会一步步讲解A星寻路算法,幷配有很多图解和例子。不管你使用的是什么编程语言或者转载 2014-07-27 19:45:29 · 1579 阅读 · 0 评论 -
翻转句子中单词的顺序
题目描述:翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。如:"I am a student."翻转成"student. a am I"。 常见面试题*/ #include#include#include#includeusingnamespace std; voidswap(ch原创 2014-07-18 13:27:56 · 820 阅读 · 0 评论 -
字符串逆序
void revert(char* str) {` char c;` for (int front = 0, int back = strlen(str) - 1;` front ` ++front, --back) {` c = str[back];` str[back] = str[front];`原创 2014-07-21 23:36:01 · 815 阅读 · 0 评论 -
找到链表的倒数第m个节点
方法1:首先遍历链表,统计链表的长度N。然后再次遍历链表,找到第N-m个节点,即为倒数第m个节点。 方法2:使用两个指针,并使它们指向的节点相距m-1个。然后同时向前移动两个指针,当一个指针指最后一个节点时,第二个指针指向倒数第m个节点。 两个方法的复杂度都是O(n)。但是当N较大而m较小时,方法2可能会更快一些。因为方法2能更好利用CPU的缓存。原创 2014-07-22 00:05:07 · 1123 阅读 · 0 评论 -
二叉树的建造、递归与非递归遍历
#include "stdafx.h"#include #include #include #include using namespace std;typedef struct _Node{ int data; struct _Node *left; struct _Node *right; bool isVisit; //用于后序非原创 2014-07-18 14:12:25 · 691 阅读 · 0 评论 -
输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来。实际上就是一个背包问题
100题之21题:编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来。实际上就是一个背包问题。求解思路:1.首先判断,如果n>m,则n中大于m的数不可能参与组合,此时置n = m;2.将最大数n加入且n == m,则满足条件,输出;3.将n分两种情况求解,(1)n没有加入,取n = n - 1; m = m;递归下去;(2原创 2014-07-19 02:47:30 · 5244 阅读 · 4 评论 -
字符串的左旋转操
题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef 左旋转2 位得到字符串cdefab。请实现字符串左旋转的函数,要求时间对长度为n 的字符串操作的复杂度为O(n),辅助内存为O(1)。 思路一:分析:如果不考虑时间和空间复杂度的限制,最简单的方法莫过于把这道题看成是把字符串分成前后两部分,通过旋转操作把这两个部分交换位置。于是我原创 2014-07-19 02:27:04 · 733 阅读 · 0 评论 -
请修改append函数,利用这个函数实现
.请修改append函数,利用这个函数实现(链表):两个非降序链表的并集,1->2->3 和 2->3->5 并为 1->2->3->5另外只能输出结果,不能修改两个链表的数据。//coder:LEE//20120307#include#includeusing namespace std;struct List{int data;Lis原创 2014-07-19 01:18:49 · 1720 阅读 · 0 评论 -
打印从1到最大的n位数(考虑大数问题)
主要考虑大数问题。n一大很容易超过正数能表示的范围,因此需要用字符数组模拟。先增加1,再打印。如下[objc] view plaincopyprint?"font-size: 18px;">#include .h> #include //溢出返回1,否则0 int add(char* number) { int overflow原创 2014-07-18 22:15:55 · 978 阅读 · 0 评论 -
数组中出现2次
假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?分析:方法一、若使用辅助的存储方式,该选择何种存储方式呢?可使用hash的存储方式,以1转载 2014-07-18 13:05:31 · 843 阅读 · 0 评论 -
C语言位运算符
一.C语言位运算符简介C语言的位运算符有六种,分别是:>> 右移运算符& 按位与运算符| 按位或运算符^ 按位异或运算符 ~ 按位取反运算符这些运算符都是对于基本数据类型的二进制位进行操作的,这里我们只讨论整型数据类型的位运算二.各个运算符的具体使用>> 右移运算符:将整数的二进制形式整体向右移动,移动过后左边缺的位的填充取决于编译原创 2014-07-18 01:36:28 · 799 阅读 · 1 评论 -
输入一个表示整数的字符串,把该字符串转换成整数并输出。
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。 思路一:1.每扫描到一个字符,我们把在之前计算得到的值乘以10再加上当前字符表示的数字值,这个思路用循环不难实现。2.由于整数字符串中可能不仅仅含有数字,还有可能以'+'或者'-'开头,表示整数的正负,如果第一个字符是'+'号,则不需要做任何操作;如果第一个字符是'-'原创 2014-07-19 02:58:19 · 4125 阅读 · 0 评论 -
一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级,求总共有多少总跳法,并分析算法的时间复杂度。
题目:一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级,求总共有多少总跳法,并分析算法的时间复杂度。注:这道题最近经常出现,包括MicroStrategy 等比较重视算法的公司都曾先后选用过个这道题作为面试题或者笔试题。 思路一:首先我们考虑最简单的情况:如果只有1 级台阶,那显然只有一种跳法,如果有2 级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1 级;原创 2014-07-19 02:12:10 · 4903 阅读 · 0 评论 -
在O(1)时间删除链表结点
在O(1)时间删除链表结点题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。 链表结点与函数的定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};void DeleteNode(ListNode** pListHead,ListNode* pTo原创 2014-07-18 22:40:23 · 619 阅读 · 0 评论 -
实现一个函数,判断输入字符串是否对称
【问题描述】实现一个函数,判断输入字符串是否对称?例如,1234554321,symmetry;12345654321,symmetry;1,symmetry【解题思路】见代码[cpp] view plaincopyprint?代码: 代码:[cpp] view plaincopyprint?转载 2014-07-18 21:28:29 · 2224 阅读 · 0 评论