剑指offer第六天

面试题21 包含min函数的栈

实现一个能够得到栈的最小元素的min函数,在该栈中调用min,push,pop的时间复杂度都是O(1)
思路 把每次的最小元素保存起来放到另一个辅助栈里
代码

#pragma mark-包含min函数的栈
void push(struct stack *data,struct stack *min,int x){
data->top++;
data->data[data->top]=x;
//如果辅助栈为空或者新加入的值小于最小值
if (min->top==-1 || x<min->data[min->top]) {
    min->top++;
    min->data[min->top]=x;
}else{
    int t=min->data[min->top];
    min->top++;
    min->data[min->top]=t;
}
}
void pop(struct stack *data,struct stack *min){
data->top--;
min->top--;
}
int min(struct stack *min){
if (min->top==-1) {
    return 0;
}else{
    return min->data[min->top];
}
}
void minstack(){
struct stack s1,s2;
s1.top=-1;
s2.top=-1;
push(&s1, &s2, 3);
push(&s1, &s2, 4);
push(&s1, &s2, 2);
push(&s1, &s2, 5);
printf("%d", min(&s2));
}

面试题23 二叉树的层次遍历

思路 每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾。该节点出队,直至队列为空。
代码

#pragma mark-层次遍历二叉树
void Toptobottom(struct BinaryTreeNode     *root,struct queue *q){
if (!root) {
    return;
}
//把根节点加入队列
q->tail++;
q->data[q->tail]=root;
//当队列不空时
while (q->tail-q->head!=0) {
    //取出队列头节点
    struct BinaryTreeNode *node=q->data[q->head];
    printf("%d",node->value);
    q->head++;
    //将左右孩子加入队列
    if (node->leftchild) {
        q->tail++;
        q->data[q->tail]=node->leftchild;
    }
    if (node->rightchild) {
        q->tail++;
        q->data[q->tail]=node->rightchild;
    }

}
}

面试题29 数组中出现次数超过一半的数字

思路 数组中一个数字出现次数超过一半,说明其他元素出现次数总和没有它多。我们保存两个值,一个是数组中的数字,一个是次数,该数字出现一次次数加一,出现别的数字就减一,如果次数为0,保存新的数字,到最后保存的数字就是数组中出现次数超过一半的数字。
代码

 #pragma mark-数组中出现次数超过一半的元素
 //思路 一个数出现次数超过一半 那么它出现次数比其他所有数总和还要多 那么每出现一次加1 出现别的数减1 最后该数肯定大于0
int MorethanHalf(int a[],int length){
int temp=a[0];
int count=1;
for (int i=1; i<length; i++) {
    if (count==0) {
        temp=a[i];
        count++;
    }else if (a[i]==temp){
        count++;
    }else{
        count--;
    }
        }
return temp;
}
void checkMorethanHalf(){
int a[5]={2,2,3,4,2};
printf("%d",MorethanHalf(a, 5));
}

面试题30 输入n个整数,找出其中最小的k个数

思路一 利用快排的思想
代码

//利用快排的思想 快速排序一趟过后 比基准元素小的元素全在左边 只要左边的数目等于k 即符合题意
void kmin(int left,int right,int a[],int k){
int i,j,t,temp;
if (left>right) {
    return;
}
temp=a[left];
i=left;
j=right;
while (i!=j) {
    while (a[j]>=temp && i<j) {
        j--;
    }
    while (a[i]<=temp && i<j) {
        i++;
    }
    if (i<j) {
        t=a[j];
        a[j]=a[i];
        a[i]=t;
    }
}
a[left]=a[i];
a[i]=temp;
//如果i等于k 则i左边正好有k个数
if (i==k) {
    for (int i=0; i<k; i++) {
        printf("%d",a[i]);
    }
    //如果i大于k 则对i左边继续排
}else if (i>k){
    kmin(left, i-1, a, k);
    //如果i小于k 则对i右边继续排
}else{
    kmin(i+1, right, a, k);
}
}

另一种思路 如果n很大,是海量数据怎么办
创建一个大小为k的容器,每次读进一个数字。
若容器不满,数字加入容器。
若容器满,找出容器中的最大值和数字进行比较,若数字较小,则替换。由于我们需要经常进行替换和查找最大值的工作,所以容器可以选择为红黑树

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 3,306评论 0 19
  • 第1章 面试的流程 编程时应注意的三点: 思考清楚再开始编码; 良好的代码命名和缩进对齐; 能够单元测试; 现场面...
    codingXue阅读 483评论 5 0
  • 总结 想清楚再编码 分析方法:举例子、画图 第1节:画图分析方法 对于二叉树、二维数组、链表等问题,都可以采用画图...
    M_巴拉巴拉阅读 1,207评论 0 7
  • 信命,不认命 信命:是因为我相信一切都是最好的安排; 不认命:是因为事在人为; 记住这次跌倒的痛,不是沉溺,而是警...
    岔子小姐阅读 327评论 0 0
  • 终于走出消极情绪,回归正常生活。 早上多睡会儿,精神恢复得也特别好。 中午老公做的午饭相当可口。
    华丽的美丽丽阅读 183评论 0 0