树的子结构
树的子结构
问题陈述
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
1234567891011121314例如:给定的树 A: 3 / \ 4 5 / \ 1 2给定的树 B: 4 /1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
思路分析
判断A,B是否为空,
比较A,B的头结点是否相等,若不等,继续比较A的左子结点,右子结点是否与B相等。
使用dfs进行深度查找,如果B为空了,说明匹配成功;如果A为空或者A!=B,匹配失败;
继续深度遍历A和B的左右子结点。
代码实现
12345678910111213141516171819202122public class SubStructrue_Of_Tree { public boolean isSubTree(TreeNode A,TreeNode B){ if(A==null||B==null) ...
调整数组顺序使奇数位于偶数前面
调整数组顺序使奇数位于偶数前面
问题陈述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
思路分析
定义两个循环变量i,j,i从数组头开始遍历寻找偶数,j从数组尾开始遍历寻找奇数,然后交换。
代码实现
12345678910111213141516171819202122public class Partition_OddAndDouble { public int[] exchange(int[] nums){ int i=0,j=nums.length-1; while(i<j){ while(i<j&&(nums[i]&1)==1) i++; //如果为奇数,则继续i++,直到发现偶数。x&1 位运算 等价于x%2取余运算,此处必须继续判断i<j,否则要一直是偶数,就死循环了,i也不可控。 while(i<j&&nums[j] ...
链表中倒数第k个结点
链表中倒数第k个结点
问题陈述
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
思路分析
普遍想法
首先获取链表的长度,然后将链表指到n-k位置即可。
1234567891011121314151617181920212223242526272829303132333435363738/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode getKthFromEnd(ListNode head, int k) { if(he ...
心迹
然后他悄然离去了,从家乡临川坐上开往乌鲁木齐的火车,火车跨过长江,经黄石到襄阳。那日傍晚襄阳城下了很大的雨,雨水浸透了古寂的城郭,继而天色昏暝了起来。
后半夜里,到了西安,这座承载着汉唐文化的古都。火车驶进未央区进入西安站的时候遥遥看见灯火点点的古城墙,曾无数次想象自己身披鹤氅衣立在古城墙上看赭红色的落日。
没有留恋,夜色更深,天色乍白的时候看着窗外打鸣的晨鸡,已经越过了秦岭与渭河,进入绵延西北的甘肃,天水,兰州。靠近兰州的时候,听到对座的妇女说她要去银川,要先下车了。宁夏银川,一听到这个地名,恍然之间感觉自己前世是古西夏逃难出来的贵家王子,路上颠沛流离染了重病,所幸途经皋兰县北一户人家挽救了生命,后来,后来就不知道如何了?
火车开出兰州第一次看见滔滔黄河。沿河西走廊进入古甘州,纷纷然很大的雪落在了甘州城……
逐渐靠近玉门关,似乎感受到了唐人“羌笛何须怨杨柳,春风不度玉门关”的惘然,亦有“黄沙百战穿金甲,不破楼兰终不还”的心惊。
玉门关外,有一座城,名敦煌,在历史的造就下有着无穷的神秘,我知道的。曾经我和敲壁画的匠人有过递夜的长谈。
进入塔克拉玛干沙漠,我弃了车,直接徒步进入大漠,我的 ...
长夏旧忆1
“我希望你平安”,和好友南山去看《八月》的时候,我们不约而同的打开手机拍下了故事中男主人公爬到树上的一幕。这使我想起我幼时也爬树,只是后来不再爬了,又岂知,在我成长的大半生里,与这一草一木朝夕相对惺惺相惜以至死生萦系。
我对树有着一种莫名的喜欢,爱其春荣秋陨,爱其繁花硕果。后来又多了一种,我喜欢有年代的古树,必要是生满绿苔的,它一定是有长长的故事,我喜欢历史深处被尘埃掩埋的那些物件的故事。当然,这些都是后来才有的感受了。
最初的感受是什么?只知道出生的所在四面有起伏连绵的山丘,近处是田野,是溪流,是竹篱村舍。夏日里一行白鹭从稻田里飞起继而绕着青山的景象我是多见的,山深又闻得那树树鹧鸪的清音。
“你下来,快下来!“母亲略有愠怒的朝我喊着。我反倒得意起来,我竟赤脚爬到了这棵大枫树的梢头,怎又肯轻易就下去呢!微风轻轻的吹动树梢,我也跟着摇晃起来。我的身边簇拥着木荷和苦槠的叶子,因而望不着底下的样子,平行看去到了我家三楼的高度。此时枫叶未丹,尚是一派青绿,叶脉在阳光下清晰可见。我想起了课本中有一篇文章《枫叶如丹》,知道北京香山的红枫是比这更壮美的,嗯 以后长大了我要去看看。想着想着,一只鸟儿 ...
长夏旧忆2
我喜欢夏季薄暮时分深蓝色的天空,蓝的那样深沉空灵,每每伏在课桌从窗外仰头看去,总是忍不住要惊叹起来。忍不住想起"槐枝啼宿鸟,冷烟浓。小楼愁倚画阑东。黄昏月,一笛碧云风。" 想起"暝色上高楼,有人楼上愁。玉阶空伫立,宿鸟归飞急。何处是归程,长亭更短亭。"的诗句来。
而此刻窗外,我正好看见了两三只鸟儿飞进了泡桐树的树冠,然后天空中再没有鸟飞过的痕迹。晚读还没有开始,同桌喊我去外面走一下,呼吸一下新鲜空气。我欣然同意了。教学楼前面有几棵高大的雪松,有同学蹲在树底下捡蝉蜕,我好奇的凑过去,“哇!真像一只活的蝉。”"是啊!但是只是它的躯壳,它的肉身已经上树了。"同学回我道。诗词里说蝉是餐风饮露的,生物书上说蝉是会吮吸树干的养分的,而我独感动它这盛夏的长鸣,无关齐女的故事。
国槐树隐约的开出了几束豆科植物的花儿,夏天依旧热烈,一如这花的开放与蝉的嘶鸣。
偌大的校园里,就我们两个班在补习,电铃响了,我们回到教室去。我拿出那本珍藏的张晓风散文集来,看着天上的半轮月,我喜欢读《细细的潮音》:后庭的月光正在涨潮,满园的林木正淹没在发亮的波澜里,我 ...
长夏旧忆3
林深静谧,万物生长。席地枯叶中忽然飞起来一只枯叶蝶,高树上坠下一粒枯裂的树果传来一刹窸窣的声音。透过树林的罅隙,外头红的蓝的光影模糊起来,我悄悄的在里面,没有人注意到我,我在等风。
风起,万物摇曳,其声,其形,无涯以止,我随之奔跑,跑出了林子,直到脚下一条河流阻去前路,我就蹲坐在河边水草丰满的大石头上,水波在动,水鸟汲水。
此岸,彼岸,风未息,百草挥动。稻田里手持长竹杠赶花粉的人们停下了步子,愉悦的自语道: "起风了。"然后见他收拾好东西,在浅浅的水滩边洗去一脚的泥巴,离去了。我犹不舍,我喜欢这样的风声:
风吹过大树的树叶;风吹过一片接一片的稻田;风吹过水面;风吹过大地……我实在想不出一个贴切的拟声词来,呼呼,哗啦啦,都不贴切的,这样长夏的南风,是饱含静气的,是热烈后的舒缓。
蝴蝶在风中凌乱的飞着,想靠在一根草尖上,可是风不许,于是蝴蝶也远去了。我不再追,就那样坐在那里,我隐藏在芒种日的稻浪里。我身后有一棵高大的皂荚树,树上有一个很大的鸟窝,方才一只黑色羽毛有白纹的大鸟飞了进去。粽叶从里发出了一丝异动,我把头低下去瞧了瞧,是一只白色的大兔子,被我发现之后,它马上就 ...
知荼词抄
知荼词抄
此卷系作者读书所录文字思想,于时光悠悠处,细看白鸟绕南山,小池澹澹碧。
第一辑 漱玉词
漱玉之名,源于李清照僦居济南处庭前漱玉泉,泉水清冽,至今汩汩。
渔家傲 天接云涛连晓雾
天接云涛连晓雾。星河欲转千帆舞。仿佛梦魂归帝所。闻天语。殷勤问我归何处。
我报路长嗟日暮。学诗谩有惊人句。九万里风鹏正举。风休住。蓬舟吹取三山去。
渔家傲 雪里已知春信至
雪里已知春信至。寒梅点缀琼枝腻。香脸半开娇旖旎。当庭际。玉人浴出新妆洗。
造化可能偏有意。故教明月玲珑地。共赏金尊沈绿蚁。莫辞醉。此花不与群花比。
如梦令 常记溪亭日暮
(一题作酒兴)
常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。
如梦令 昨夜雨疏风骤
(一题作春晚)
昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
如梦令 谁伴明窗独坐
谁伴明窗独坐,我共影儿俩个。灯尽欲眠时,影也把人抛躲。无那,无那,好个凄凉的我。
浣溪沙 绣面芙蓉一笑开
绣面芙蓉一笑开。斜飞宝鸭衬香腮。眼波才动被人猜。
一面风情深有韵,半笺娇恨寄幽怀。月移花影约重来。
浣 ...
两个栈实现队列
两个栈实现队列
问题陈述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
思路分析
设计其中一个栈为主栈,另一栈为辅助栈,然后根据队列先进先出的特性,我们需要保持每次入主栈元素放入栈底,这样最先进入的元素位于栈顶,实现了先进先出。
代码实现
1234567891011121314151617class CQueue { LinkedList<Integer> A, B; public CQueue() { A = new LinkedList<Integer>(); B = new LinkedList<Integer>(); } public void appendTail(int value) { A.addLast(value); } p ...
快速幂应用
快速幂应用
快速幂,也称平方求幂,可以在O(nlogn)时间复杂度内计算乘方,在许多算法中如大数求余中被广泛应用。
问题引出
如计算7的10次方,怎么算比较快?
普遍的想法是10个7一直乘下去,共执行9次乘法运算。这样是比较慢的,而且也没发挥出cpu的高性能计算。
于是,我们可以进行一个拆分操作。先7×7=49,然后7的5次方49×49×7=16807,再然后7的5次方乘7的5次方,计算得到7的10次方。
算法思路
以上可概述为一个二分的思想,并且得到一个递归方程:
代码实现
原理代码
12345678910111213//递归快速幂int quick_pow(int a, int n){ if (n == 0) return 1; else if (n % 2 == 1) return quick_pow(a, n - 1) * a; else { int temp = quick_pow(a, n / 2); return temp * temp; } ...