C语言
shaonian7812
这个作者很懒,什么都没留下…
展开
-
链表
微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。 为了简化问题,我们假设俩个链表均不带环。Solution:#includebool isJoin(Llink h1,Llink h2){ LinkNode* p,*q; if(NULL==h1||NULL==h2) return fa原创 2013-04-01 15:06:29 · 358 阅读 · 0 评论 -
100盏灯
问题:有100盏灯泡,第一轮点亮所有电灯,第二轮每两盏灯熄灭一盏,即熄灭第2盏,第4盏,以此类推,第三轮改变编号为3的倍数的电灯,第3盏,第6盏,如果原来那盏灯是亮的,就熄灭它,如果原来是灭的,就点亮它,以此类推,直到第100轮。问第100结束后,还有多少盏灯泡是亮的?解答:由题意最如果最后某一盏灯是亮着的,那么它一定是被切换了奇数次(第0次的时候全部都关着)。原创 2013-10-03 17:13:18 · 532 阅读 · 0 评论 -
等概率生成器
假设生成0的概率是p,生成1的概率是1-p,则生成01和10的概率相等。随机生成0、1int rand_Z_One(){ int n = rand(); if(n>1000) return 0; else return 1;}等概率生成0、1即概率为0.5;int newRand原创 2013-04-17 16:00:10 · 468 阅读 · 0 评论 -
求出现次数超过一半的数
比较牛逼的解法如下:其中的count统计比较多的数出现的次数#includeint getMajor(int* arr,int n){ int num = 0; int count = 0; for(int i = 0;i<n;i++) { if(0==count) {原创 2013-04-14 16:46:02 · 390 阅读 · 0 评论 -
微软的二分查找变形题
微软:一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。#includeint biSearch(int* arr,int low0,int high0,int k){ int low = low0; int high = high0; int m = (l原创 2013-04-11 15:29:10 · 403 阅读 · 0 评论 -
跳台阶问题
题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。 求总共有多少总跳法,并分析算法的时间复杂度。分析: n=1时只有一种跳法;f(1) = 1; 1 n=2时有两种跳法;f(2) = 2; 1,1或2 n>2时分两种一种是第一次跳一个台阶另一种是第一次原创 2013-04-05 16:35:18 · 353 阅读 · 0 评论 -
定义Fibonacci数列
/ 0 n=0 f(n)= 1 n=1 / f(n-1)+f(n-2) n=2 输入n,用最快的方法求该数列的第n项。方法一:#includeint fib(n){ int i = 2; int k = 0; int s1=0,s2 = 1; if(0==n) return 0; if(1==n) return 1; for(;i<=原创 2013-04-02 21:50:44 · 453 阅读 · 0 评论 -
输入一个已经按升序排序过的数组和一个数字
void findTwoNum(int* arr,int n,int sum){ int low = 0; int high = n-1; while(low<=high) { if(arr[low]+arr[high]==sum) { printf("%d %d\n",arr[low],arr[high]); return ; } else if(ar原创 2013-04-02 09:42:21 · 616 阅读 · 0 评论 -
输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表 的尾指针
#include typedef struct ListNode{ struct ListNode* next; int data;}ListNode;ListNode* findKNode(ListNode* head,int k){ if(NULL==head||k<=0) return NULL; ListNode*p ,*q; p = head; q = head原创 2013-04-02 09:32:46 · 460 阅读 · 0 评论 -
求子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1,-2,3,10,-4,7,2,-5,和最大的子数组为3,10,-4,7,2,因此输出为该子数组的和18。*/#includeint findMaxSubSum(int* arr,int n)原创 2013-04-01 09:36:23 · 479 阅读 · 0 评论 -
物理内存管理(页管理)
Linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成无数4k(在i386体系结构中)大小页,从而分配和回收内存的基本单位便是内存页了。利用分页管理有助于灵活分配内存地址,因为分配时不必要求必须有大块的连续内存[1],系统可以东一页、西一页的凑出所需要的内存供进程使用。虽然如此,但是实际上系统使用内存还是倾向于分配连续的内存块,因为分配连续内存时,页表不需要更改,因此能降低TLB的刷新原创 2013-09-25 16:20:50 · 968 阅读 · 0 评论