刷题
文章平均质量分 63
午饭要阳光
热爱编程
展开
-
对一个数组,按照给定的下标进行排序,仅使用两两交换的方式
对一个数组,按照给定的下标进行排序,仅使用两两交换的方式,空间复杂度O(1)。例:原数组 A B C D E,现给定新位置为3 0 1 4 2 排序后的结果是D A B E C 初次见到这道题的时候,着实让我头疼了一把,最后经人指点,自己也就有了一个大致的思路,下面将这道题的解法做一下总结。分析:这道题要用到挖洞法的思想,不过要在挖洞法的基础上再做一些改进。 例1:原数组 A B C D原创 2016-12-17 15:11:50 · 4988 阅读 · 2 评论 -
剑指offer-第四十题方法总结
题目:一个数组中只有两个数字单独出现,其余数字都是成对出现的,请找出这两个数。 看到这道题目大多数人第一时间想到的就是排序,排序完成后相邻两个数如果不同,则其中一定有一个是我们要找的数,从这两个数中间将数组分成两部分,分别异或得到的结果就是我们最终要求的两个数。于是我们可以写出下面这样的代码!!!#include#includeint check(int原创 2016-05-18 18:34:23 · 3149 阅读 · 0 评论 -
剑指offer-第三十五题方法总结
题目:在字符串中查找第一个只出现一次的字符,例如:输入"abbbacfes",则输出'c'. 看到这道题,大部分人都会想到从头扫描字符串中每个字符,并与后面的的字符进行比较,如果后面没有出现重复的字符,则该字符就是要寻找的字符。为此我们可以写出下面的代码。char check(char const *src){ assert(src); char const *psrc原创 2016-05-18 19:36:32 · 3496 阅读 · 2 评论 -
剑指offer—第42题分析
题目:输入一个字符串,输出对应的整数。例如:输入"12345",输出对应的整数12345.这不就是库函数里面的atoi吗!!! 大部分人都不加思索的写出如下程序。intmy_atoi(char*arr){ assert(arr); int num = 0;原创 2016-05-22 17:17:18 · 1798 阅读 · 0 评论 -
小技巧----“三步翻转法”
例:实现字符串右移函数,比如"abcdefghi"循环右移3位就是”ghiabcdef“.#include#include#include#includevoid revers(char *left,char *right) //翻转函数,left代表起始位置,right代表结束位置{ assert(left);原创 2016-05-31 22:08:30 · 7364 阅读 · 4 评论 -
不使用中间变量交换两个数. 求平均数考虑溢出
#define _CRT_SECURE_NO_WARNINGS 1#include#include//不使用中间变量交换两个数的值void exchange_num(int *a, int *b){ ①* a =*a + *b; //适用范围广 * b = *a -* b; * a =* a - *b;原创 2016-05-12 23:28:00 · 904 阅读 · 0 评论 -
“说反话”实现字符串反转
例:输入 “I Love you”,输出“you Love I”;在不使用库函数,不使用sizeof()的情况下:#include#includevoid reverse_str(char *p,int len) //定义一个反转函数{ char *left = p; char *right = p + len-1; while (left <rig原创 2016-05-12 23:28:46 · 3686 阅读 · 4 评论 -
蛇形数组和“之”字形打印
蛇形数组:上面的数组就叫做蛇形数组。如何打印蛇形数组:一定不要一行一行的考虑,不然就陷入误区了。#include#include#define line 10 void initsarr(int arr[line][line]){ int i1 = 0; int j1 = 0; int m1 = line - 1; int n1 = l原创 2016-05-13 00:25:52 · 1343 阅读 · 0 评论 -
递归实现字符串反向排列
递归实现字符串反向排列决对不是一个好的方法,也不提倡这么去做。这里只是借助这个题深入的了解一下递归:例:不使用库函数实现,递归实现字符串反向排列#include#include#includeint my_strlen(char const *str){ assert(str); int len = 0; while (*str) { len++;原创 2016-05-13 16:27:19 · 1645 阅读 · 0 评论 -
剑指offer-第十题方法总结
题目:实现一个函数,输入一个整数,请输出这个数的二进制表示中1的个数。例如:输入5,的二进制是101,有两个1则输出2.这个题目很简单啊!!!intcount_one(intn){ intcount = 0; while(n) {原创 2016-05-18 14:16:48 · 1255 阅读 · 0 评论 -
剑指offer-第九题方法总结
题目: 输入n,求斐波那契数列第n项。斐波那契数列的第0项为0,第一项为1,之后的项依次为前两项之和。这个问题有两种思路,一种是递归,一种是非递归。分析:1、递归 要求第n项,首先就要求出第n-1,n-2项,依次类推。递归的出口就是第0项为0,第1项为1.使用递归虽然代码很简单,但如果n大一点的话,所产生的运行时开销会非常大,这样做的后果就是效原创 2016-05-18 12:57:27 · 1094 阅读 · 0 评论 -
剑指offer-第12题方法总结
题目:输入数字n,按顺序打印从1位到最大n位的十进制整数 。例如:输入3,则从1打印到999.乍一看,这个问题很简单啊!!!voidoutput(intn){ inti = 0; for(i = 1; i n ); i++) { printf("%d\n",原创 2016-05-16 13:15:23 · 5057 阅读 · 0 评论 -
简易动态进度条实现
在生活中我们随处可见进度条,下面我们来实现一个能够动态变化简易的进度条。 分析:在这里所谓的动态变换其实不是真的让它进行动态变换,而是利用人眼的视觉暂留现象,当进度条显示出来的时候看起来像是动态变换的。 如上图: 最开始用一个”=”表示进度是1%,当把这个进度的状态显示完毕之后,我们再回到这一行的开始位置输出两个”=”表示2%。原理就是这样,比较简单的,但是在这里面我们需要注意两个原创 2016-12-31 20:39:26 · 7283 阅读 · 0 评论 -
大数据——面试题总结(1)
1、给出一个超过100G的log file,log中存着ip地址,设计算法找到出现次数最多的ip地址?分析: 由于文件超过100G,所以我们必须先对文件进行切分,然后再利用数据结构的知识求解。关键是如何切分效率最高???解决方法: 我们可以使用哈希切分,将同一个ip都分割到同一个文件中,注意同一个ip经过同一个散列函数 一定会进入到同一个文件中,然后再统计每一个原创 2016-11-09 15:27:52 · 2981 阅读 · 0 评论 -
二叉树经典面试题
以下二叉树的结点类型如下:templatestruct BinaryTreeNode{ T _data; BinaryTreeNode *_left; BinaryTreeNode *_right; BinaryTreeNode(const T& data = T()) :_data(data) , _left(NULL) , _right(NULL){}};原创 2016-11-18 20:18:21 · 2253 阅读 · 0 评论 -
海量数据排序
排序分为内部排序和外部排序两大类,若要排序的元素很多,整个序列的排序过程不可能在内存中完成,则此类排序就称为外部排序。针对外部排序这种问题,下面我们来介绍一种方法。 由于要排序的数据量很大,不可能一次性加载到内存,所以我们就采取"分而治之"的方法。先将大文件分割成若干的小文件,使得小文件中的数据能够完全加载到内存。然后分别将每个小文件加载到内存并使用快速排序使之有序,将有序的序列再放回到小文原创 2016-11-27 13:13:24 · 2255 阅读 · 0 评论 -
栈&&队列面试题
问题:1. 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)2. 使用两个栈实现一个队列3. 使用两个队列实现一个栈4. 判断元素出栈、入栈顺序的合法性。如:入栈的序列(1, 2, 3, 4, 5),出栈序列为(4, 5, 3, 2, 1)是合法序列,入栈的序列(1, 2, 3, 4, 5),出栈序列为(1, 5原创 2016-09-15 17:07:05 · 1727 阅读 · 3 评论 -
利用堆求最大或最小的前k个数
用堆在海量数据中找出最大或最小的k个数,效率非常高。1、在一组数据中找出最小的k个数解题思路: 要找出最小的k个数,我们可以先用这组数据中的k个数构建一棵“最大堆”,然后再将剩下的元素与堆顶元素相比。如果大于堆顶元素,则不做处理,继续向下比较。如果小于堆顶元素,则将堆顶元素与这个元素交换,然后再恢复堆序,继续向下比较。这样的话最后这个堆里面保存的就是最小的k个数。例:原创 2016-10-11 21:40:56 · 2178 阅读 · 0 评论 -
寻找单独出现的数——通用技巧
请使用最快的方法,寻找单独出现的数。例1:在一组数据中,只有一个数出现一次,其余数都出现两次,请找出这个单独出现的数。例2:在一组数据中,只有一个数出现一次,其余数都出现三次,请找出这个单独出现的数。例3:在一组数据中,只有一个数出现一次,其余数都出现四次,请找出这个单独出现的数。例4:在一组数据中,只有一个数出现一次,其余数都出现五次,请找出这个单独出现的数。........原创 2016-06-10 09:28:09 · 2735 阅读 · 0 评论 -
求一个数的二进制逆序之后所对应的数
例:100000000 00000000 00000000 00000001逆序之后是:10000000 00000000 00000000 00000000#include#includeint main(){ int n = 0; int num =0; in原创 2016-05-13 16:56:26 · 1769 阅读 · 0 评论 -
求单独出现的数,strncpy的优化
求未配对的数(1):在一组数据中有 只有一个数出现了一次,其余的数都是成对的出现,请找出这个数:这个题很容易解决,只要把这组数据全部异或(相同为零,不同为1),所以出现两次的数异或后就为零,最后剩下的就是出现一次的数。#include#includeint find_once_num(int arr[], int len ){ int num原创 2016-05-13 16:35:03 · 1475 阅读 · 0 评论 -
内存对齐 大端字节,序小端字节序验证
空结构体:对于空结构体,就是只有结构体这个模子,但里面却没有元素的结构体。例:typedef struct student{}std;这种空结构体的模子占一个字节,sizeof(std)=1。柔性数组:结构体中最后一个元素可以是一个大小未知的数组,称作柔性数组成员,规定柔性数组前面至少有一个元素.typedef struc原创 2016-05-13 16:37:20 · 1740 阅读 · 0 评论 -
两端输出字符,从两端移动向中间汇聚; 模拟三次密码输入
编写代码,演示任意一个字符串从两端移动,向中间汇聚,并以这样的形式输出。#includeSleep(n毫秒)延迟n毫秒再输出分析:代码:#include#include#include#includeint main(){ int i = 0;原创 2016-05-11 12:45:49 · 480 阅读 · 0 评论 -
求一个数的二进制中有多少个一
求一个整数所对应的二进制中有多少个bit位为一#include#includeint count_one_bits(unsigned int value){int count = 0;for (int i = 0; i {if (value & 1 == 1){count++;}value = value >> 1;}retur原创 2016-03-15 00:35:09 · 656 阅读 · 0 评论 -
求素数,乘法口诀表,判断闰年
1. 打印100~200 之间的素数2. 输出乘法口诀表3. 判断1000年---2000年之间的闰年#include#include#includeint main(){int count = 0;int div = 0;printf("输出100—200之间的素数\n");for (int prime = 101; prime{for原创 2016-03-15 17:58:26 · 933 阅读 · 0 评论 -
交换两个变量的值,不创建中间变量。求函数返回参数二进制中 1 的个数
1.给定两个整形变量的值,将两个值的内容进行交换。2. 不允许创建临时变量,交换两个数的内容(附加题)3. 求10 个整数中最大值。4. 写一个函数返回参数二进制中 1 的个数比如: 15 0000 1111 4 个 1程序原型:int count_one_bits(unsigned int value){ // 返回 1的位数原创 2016-03-15 18:06:16 · 860 阅读 · 0 评论 -
求一个数二进制1的中
#include#include#define _CRT_SECURE_NO_WARNINGS 1int count_one_bits(unsigned int value){int count = 0;while (value){if ((value &1)==1)count++;value = value >> 1;}return count;原创 2016-03-16 21:10:43 · 473 阅读 · 0 评论 -
求一个数二进制中1的个数(优化)。求一个数是不是2的n次方
求一个数二进制中1的个数:一般方法:#include#includeint count_one_bits(unsignedint value){ int count = 0; for (int i = 0; i { if (value & 1 == 1) (%2相当于&1) {原创 2016-03-17 23:51:04 · 835 阅读 · 0 评论 -
使用动态内存求解任意矩阵的乘法
#define _CRT_SECURE_NO_WARNINGS 1#include#include#includevoid input(float **p, int x, int y){ for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { scanf("%f", &p[i][j]); } }}原创 2016-03-18 00:40:41 · 681 阅读 · 0 评论 -
复数的四则运算
#include#includevoid add_state(float a, float b, float x, float y){ float m = a + x; float n = b + y; if (n > 0) printf("%f+%fi\n", m, n); else printf("%f%fi\n", m, n);}void sub_state(flo原创 2016-03-18 00:46:31 · 1119 阅读 · 0 评论 -
百钱买百鸡最优解
原创 2016-05-11 12:44:26 · 1293 阅读 · 0 评论 -
求素数的优化。求任意阶乘法口诀表。判断闰年
1. 打印100~200 之间的素数2. 输出乘法口诀表3. 判断1000年---2000年之间的闰年#include#include#includeint main(){ int count = 0; int div = 0; printf("输出100—200之间的素数\n"); for (int prime = 101; prime<= 200; prim原创 2016-05-11 12:32:13 · 431 阅读 · 0 评论 -
求n的阶乘以及前n个数的阶乘和
//求n的阶乘#include#includeintmain(){ int n = 0; int sum = 1; scanf("%d", &n); while (n)原创 2016-03-20 21:41:35 · 2888 阅读 · 1 评论 -
打印杨辉三角
使用动态内存打印任意阶杨辉三角:#include#includevoid init_arr(int **p,intline){ for (int i= 0; i<line; i++) { p[i][0] = 1; }原创 2016-05-13 16:50:04 · 728 阅读 · 0 评论 -
猜数游戏,产生一个随机数
产生一个随机数,用户输入一个数,与之比较。 rand()这个函数可以产生一个随机数,但是产生随机数的范围是0到65535,而且产生一个随机数后,再次产生的随机数将不再改变。限制rand()的取值范围:在函数后模一个你想取得的最大数再加一。例: rand()%10 产生的是一个从0—9的数, rand()%101 产生一个从0—100的数。原创 2016-05-11 12:54:53 · 2128 阅读 · 0 评论 -
求n的阶乘以及前n个数的阶乘和
//求n的阶乘#include#includeint main(){ int n = 0; int sum = 1; scanf( "%d", &n); while (n)原创 2016-05-11 12:55:30 · 987 阅读 · 0 评论 -
剑指offer第四题方法总结
题目:输入一个字符串,要求将这个字符串中所有空格的位置都替换成”%20“.例:输入I love you. 输出I%20love%20you.分析:空格是一个字符,%20是三个字符,所以替换的时候要向后挪动。 这里有三种方法。 第一种:从前向后遍历字符串,遇到一个空格,则将这个空格之后的字符'\0'开始依次向后挪动两个字符,然后再放入%20,直到遍历完原创 2016-05-12 00:15:40 · 1760 阅读 · 0 评论 -
剑指offer-第三题方法总结
杨氏矩阵:每一行自左向右递增,每一列自上向下递增。题目:输入一个杨氏矩阵和一个整数,判断这个数是在杨氏矩阵中出现。分析:有三种时间复杂度各不相同的解法。 第一种:遍历整个二维数组,这种方法效率最低。 第二种:因为杨氏矩阵每行都是递增的,是有序的,我们可以先判断这个整数是否大于等于每行的第一个元素,小于等于最后一个元素。如果是的话,则对原创 2016-05-12 00:19:21 · 2914 阅读 · 2 评论 -
文本编辑器
可以接受多行,知道接受一个空行结束,将接受的内容打印出来:#include#include#include#define LINE 100#define MAX 50int main(){ char arr[LINE][MAX]; int i = 0, j = 0; for (i = 0; i < LINE; i++) { printf("%d:", i + 1)原创 2016-05-12 23:23:54 · 466 阅读 · 0 评论 -
折半查找<二分查找>
折半条件:必须在一个有序数组内进行。例如:在一个数组中查找一个数,找到就输出该元素下标,如果没找到就输出-1:#include#include#includeintbin_search(int*p,intx, int n){ int left = 0; int right =原创 2016-03-20 21:36:47 · 527 阅读 · 0 评论