剑指offer
魏尔肖
如果生命没有起伏那么何来意义
展开
-
按照顺时针的顺序从外向里打印整形数组
做这道题时要有清晰的思路,分4个方向打印,每次从左上角(0,0),(1,1)....开始,最后一次为行或列中小的一个的1/2,如果行和列不相等最后都会剩下一行或者一列,只剩一行时只需再打印第一步,剩一列时需要打印1 ,2步#include void outPrint( int arr[3][5], int clo, int row){ if ( NULL == ar原创 2017-03-12 11:43:11 · 801 阅读 · 0 评论 -
单链表相关面试题总结
主要来自于《剑指offer》,都是面试高频题1. 删除结点删除节点需要知道上一个节点的地址。就需要遍历,可以把问题转化为删除下一个节点,把下一个节点的值拷贝给本节点。 删除pdel就转化为删除pnext,不需要再从头遍历。时间复杂度为O(1).但是pdel为尾节点或者头节点需要另外的处理。typedef struct SignalListNode { SignalListNode(co原创 2017-07-10 23:30:39 · 608 阅读 · 0 评论 -
用两个栈实现一个队列
栈是先进后出,队列是先进先出每次元素都push在st1中,pop的时候如果st2为空,将st1的栈顶元素放在st2的栈底,这样st1的所有元素都放在st2中,st1的栈底就是st2的栈顶,pop st2的栈顶,这样就满足了队列的先进先出。 #include <iostream>using namespace std;#include <stack>#include <stdlib.h>tem原创 2017-05-22 00:09:20 · 306 阅读 · 0 评论 -
剑指offer —— 替换空格
把一个字符串如:we are happy中的空格替换为%20 输出 :we%20are%20happy#include #include #include #include char* replaceSpace(const char* str){ int count = 0; int len = 0; char* oldstr = str; char* newstr = NUL原创 2017-03-01 17:14:00 · 277 阅读 · 0 评论 -
剑指offer--找出旋转数组中的最小元素
把一个数组最开始的元素搬到数组的末尾,称之为数组的旋转,输入一个递增排序的旋转数组,输出旋转数组的最小元素,例如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转数组,最晓得元素为1。#include #include int Min(const int* arr,int right){ int left = 0; assert(arr); if (right == 0)原创 2017-03-01 17:41:15 · 343 阅读 · 0 评论 -
剑指offer ——斐波那契数列
提到斐波那契大家可能太差就会想到递归算法,递归算法简洁方便却存在一定问题,当数比较大时需要很多次递归,每一个数都需要重复的计算,效率很差,栈空间可能也会被消耗完。每次计算后将上两次的值保存下来int fbonaqie_1(int k){ int lasttwo = 0; int lastone = 1; int now = 0; if (k<=0) return 0; if原创 2017-03-01 23:42:11 · 362 阅读 · 0 评论 -
剑指offer -- 返回二进制中1的个数
输入一个整数,返回这个数二进制中1的个数第一种方法int One(int n){ int count = 0; while (n) { if (n & 1) count ++; n = n>>1; } return count;}这种方法可能使大家第一时间想到的,输入正数可以正确计算,输入负数程序却会奔溃,因为一个数向左移n位,就会补足n个第一位数字,原创 2017-03-02 21:21:44 · 299 阅读 · 0 评论 -
剑指offer 求一个数的n次方,不考虑大数问题
一定得注意取值,当指数小于0,指数大于0,指数等于0时如果指数和底数都是0时怎么办,还有浮点数的比较#include #define ESP 0.0000001typedef enum bool{ false = 0, true = 1}bool; bool value_num = false; //定义一个全局变量用来区分正确时返回的0和错误时返回的0do原创 2017-03-08 18:50:50 · 416 阅读 · 0 评论 -
剑指offer 打印1到最大的n位数
#include #include #include using namespace std;void PrintMaxN(char* num){ int flag = 1; int len = strlen(num); for (int i = 0;i<len;i++) { if (!(num[i] - '0') && flag) continue ;原创 2017-03-08 23:50:47 · 236 阅读 · 0 评论 -
调整整形数组奇数和偶数的位置
用两个标记分别指向第一个元素和最后一个元素,第一个标记找到最前面的偶数,第二指向最后面的奇数,将两个数交换,这种方法比遍历效率更高。 用回调函数可以处理相似的问题。 void swap(int* num1, int* num2 ){ int temp = *num1; *num1 = *num2; *num2 = temp;}bool isodd (int num ){原创 2017-03-11 16:55:06 · 592 阅读 · 0 评论 -
排序相关面试题总结
旋转数组中的最小元素如{3,4,5,1,2},就是{1,2,3,4,5}左旋两个得到,因为数组可以分为两个递增的部分,左边大于右边,用二分法的思想,中间元素如5大于2,说明5在左边部分,最小元素在右半部分,缩小区间到{5, 1, 2}之间。时间复杂度为O(logN). 注:如果左边元素与右边元素中间元素相同,需要另外处理。如{1,1,1,0,1}和{1,0,1,1,1}都是旋转数组,无法用二分法判原创 2017-07-26 20:55:33 · 1175 阅读 · 0 评论