剑指offer
ojshilu
https://github.com/lucky521
展开
-
1352 找出数组中和为k的两个数
#include#includeusing namespace std;int main(){ int n,k; int *a; while(scanf("%d %d",&n,&k)!=EOF) { a = new int[n]; for(int i=0;i<n;i++) scanf("%d",&a[i]); int left=0,right=n-1; w原创 2013-07-14 20:34:52 · 1046 阅读 · 0 评论 -
判断出入栈序列的合法性 Stack Sequence
给出一个入栈序列,一个出栈序列。判断,是否存在合法的出入栈操作,满足这样的入栈序列和出栈序列。思路:故事重现一遍,能顺利完成所有操作就存在,中间出现矛盾就不存在。所有数都要在栈里走一回。如果栈为空,没的出,只能是要入栈;如果栈顶元素不是要出栈的元素就继续入栈;如果栈顶元素是要出栈的元素,就要出栈(注意只有这样才能出栈);如果最后出栈序列的元素都出来了,栈也为空了原创 2014-03-02 20:21:14 · 2634 阅读 · 0 评论 -
找出所有和为n的连续正整数序列
给出一个正整数n,要你找出所有和为n的连续正整数序列。比如n=15,那么和为15的连续正整数序列有:7 8, 4 5 6,1 2 3 4 5.这三个序列都是连续的,并且和都是15。思路:想想另外一个问题。《找出序列中和为n的的两个数》,先保证序列有序。使用的是左右指针,当和超过n时右指针左移1个,当和小于n时左指针右移1个。对于当前问题,还不知道累积的数会有多少个。但应该知道,原创 2014-03-02 21:10:26 · 4554 阅读 · 0 评论 -
实现深拷贝的类 Deep Copy
如果一个类中有指针对象,那么在拷贝这个类的对象的时候,默认的拷贝方式是只拷贝指针本身,而不重新构建并拷贝指针所指内容。这就叫做浅拷贝Shallow Copy。如果拷贝的方式是不仅仅拷贝指针,而且把指针所指的内容也新建一份,那就叫深拷贝Deep Copy。注意两点:C++在构建默认的拷贝构造函数和赋值运算符重载的时候,对指针的拷贝都是浅拷贝;但是对数组的拷贝是深拷贝!所以,类中有数组成员和指针成原创 2014-02-26 18:41:42 · 2483 阅读 · 0 评论 -
附有随机结点指针的链表的深度拷贝 Copy List with Random Pointer
问题:A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.Return a deep copy of the list.思路:目前想到的办法是借助hash保存旧结点到原创 2014-03-13 18:27:36 · 1711 阅读 · 0 评论 -
根据前序和中序序列重建二叉树 Construct Binary Tree from Preorder and Inorder Traversal
9oj编号1385。题目:根据二叉树的前序遍历序列和中序遍历序列,求得该二叉树的后序遍历序列。注意:有个前提,二叉树中的所有元素都不相同。方法:根据前序序列和中序序列重建二叉树原型,然后进行后序遍历。所以关键就在于重建二叉树。使用递归的方法比较容易。如下图所示,对于二叉树的构建过程也是递归的。首先把当前前序遍历序列的第一个元素作为root结点,并在在中序遍历中找原创 2013-09-20 22:18:02 · 1242 阅读 · 0 评论 -
圆圈报数最后剩下的数 约瑟夫环问题 Joseph
问题:有n个数,围成一个圈。现在从某一个数开始顺时针报数(第一个报1,依次报数),当报到m时,将报数者删除。并从下一个数开始重新报数。问,最后一个留下的数是谁?假设这n个数依次是0,1,2...n-1。问题源于:高德纳的《具体数学》。9oj编号1356。剑指45。思路:本题最直观的思路是按照题目说的一步一步做,O(n*m)级别的。当数字n很大的时候,变得非常慢。因此下面原创 2013-09-15 22:35:24 · 4113 阅读 · 1 评论 -
翻转单词顺序 Reverse Words in a String
问题:Given an input string, reverse the string word by word. For example,Given s = "the sky is blue",return "blue is sky the".思路:两轮翻转。第一次整个串彻底反转,第二次逐个单词自身翻转。输入用例:输入数据的细节特别重要。开头有空格、结尾有空格、多个原创 2013-09-05 20:19:01 · 959 阅读 · 0 评论 -
数组中,有三个数只出现1次,其他都出现2次,找出来那三个数。 3 Unique
问题:数组中,有三个数只出现1次,其他都出现2次。找出来那三个数。注意:由于3是奇数,所以这三个数都相同的位异或起来也会是1。思路:假设将数组中所有数异或起来之后。假如某一位为0,说明所求那三个数在这一位是000或者110. 假如某一位为1,说明所求那三个数在这一位是100或者111.因此根据这个异或结果没办法找出一个位进行有效的分组。原创 2014-03-20 10:23:56 · 2013 阅读 · 0 评论 -
两个有序链表的合并 Merge Two Sorted Lists
1、记着怎么定义这样的结构体。typedef struct node{ int data; struct node *next;}node, *List;2、到哪儿都注意,防止指针为空、防止链表为空。List merge(List l1, List l2){ node *p3; List l3=NULL; if(l1==NULL) return l2原创 2013-09-05 12:55:33 · 1400 阅读 · 0 评论 -
只用位运算来实现整数的加减乘除四则运算
问题一: 位运算实现加法问题二:只用加法实现减法、乘法、除法问题三:只用加法实现1+2+3+...+n,(循环、判断语句也不用)下面逐一解决:问题三:方法1:只用加法实现1+2+3+...+n1、利用递归来代替循环结构;2、利用&&与运算的特性来代替if结构。int add(int n, int &sum)原创 2013-09-05 22:21:38 · 15760 阅读 · 5 评论 -
二进制形式中1的个数
#include#includeusing namespace std;int main(){int input,count,num;scanf("%d",&num);for(int i =0;i{scanf("%d",&input);if(input == 0){printf("0\n");continue;}count原创 2013-07-12 16:16:58 · 844 阅读 · 0 评论 -
杨氏矩阵中的查找问题
1,太不细心了:行列不分!!与或不分!!2,边界值要想清楚。3,申请完内存要释放。4,scanf来替代cin5,整型数组的scanf也得有&#include#includeusing namespace std;int main(){ int row_num, col_num, value; int index_row, index_col; int f原创 2013-07-13 10:06:57 · 1308 阅读 · 0 评论 -
逆转链表 Reverse Linked List
#include#include#includeusing namespace std;typedef struct node{ int data; struct node *next;}node,*List;int main(){ List head = NULL; node *n; int input; cin>>input; while(input != -原创 2013-07-12 15:43:22 · 1404 阅读 · 0 评论 -
1387 斐波纳契
#include#includeusing namespace std;// 0 1 1 2 3 5unsigned long m[71];unsigned long fun(int n){ for(int i=0;i<=n;i++) { if(i==0) m[i]=0; else if(i==1) m[i]=1; else m[i]=m[i-1]原创 2013-07-13 10:23:15 · 794 阅读 · 0 评论 -
1349 数字在有序序列中出现的次数
1,极端情况要想清楚。都考虑到、并处理掉,才可以。2,数组的长度受内存大小限制,太大的话就要另想算法了。3,用二分查找更好。怎么样设计两种不同的二分查找?原创 2013-07-14 22:12:19 · 904 阅读 · 0 评论 -
1510 替换空格
#include#includeusing namespace std; int main(){ char str[1000000]; gets(str); if("" == str) return 0; int len = 0; int blanknum = 0; int i =原创 2013-07-12 14:55:42 · 958 阅读 · 0 评论 -
1362 循环左移字符串
1、根据1361的原理,对这道题进行联想。发现本问题可以采用两次翻转方法。(看来这样翻转局部位置但不翻转内部顺序的问题都可以这样解决)第一次整体翻转,第二次局部翻转。(或者先局部翻转,再整体翻转)2、需要注意一个点:循环左移。 要做到真正的循环,需要对移动次数求模。找到实际移动的次数。# include# include# include int reverse(cha原创 2013-09-05 20:45:22 · 1117 阅读 · 0 评论 -
1508 把字符串转换成整数 atoi()
# include# include# include int my_atoi(char *str, int &num) //返回值表示状态{ int sign=1,index=0, w=1; int len = strlen(str); if(str==NULL || len==0) //合法性检查 return -1; if(str[index]=='-') //正负数原创 2013-09-05 16:24:50 · 1072 阅读 · 0 评论 -
1350 求二叉树的深度
竟然运行一次直接AC!!不可思议!明天再看一下。#include#includeusing namespace std;typedef struct Tnode{ int data; struct Tnode *left; struct Tnode *right;}Tnode;int depth(Tnode *root){ if(root == NULL)原创 2013-07-13 23:05:31 · 739 阅读 · 0 评论 -
1390 小矩形覆盖
1,递归方法超时2,int型存储溢出3,Output Limit Exceeded错误#include#includeusing namespace std;unsigned long a[71];int fun(int n){ for(int i=1;i<=n;i++) if(i == 1) a[i] = 1; else if(i ==2)原创 2013-07-12 17:50:02 · 872 阅读 · 0 评论 -
一个序列里的数字都是成对的,只有一个是单个的,找出来。
#include#includeusing namespace std;int main(){ int n,result=0; scanf("%d",&n); if(n%2 == 0) { printf("impossible!\n"); //这样的序列的个数一定是奇数个元素 return 0; } int *a = new int[n]; f原创 2013-07-15 21:07:52 · 2227 阅读 · 1 评论 -
丑数 Ugly Numbers
问题:Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, …shows the first 11 ugly numbers. By convention, 1 is included. Write a program to原创 2013-12-29 16:22:04 · 1636 阅读 · 0 评论 -
数组中出现次数超过一半的数字 MoreThanHalfNum
9oj编号1370. 剑指29. 编程之美的发帖水王。普通方法:排序,然后找位于中间位置的数。进阶方法:Hash映射次数。高级方法:擂台PK法。排序法(堆排序)的代码:#include //向堆中加入新元素并调整void MinHeapFixup(int a[], int i){ int j, temp; if(i==0) return;原创 2013-09-28 17:51:11 · 1319 阅读 · 0 评论