思考
刘奉钦-以书会友
这个作者很懒,什么都没留下…
展开
-
换个维度理解Embedding
长、宽、高是三个维度,这是对维度最基础的理解,时间也是一个维度,除此之外,我们可以把语言、声音等等这些都理解为一个维度。我们认识一个人可以从许多个维度来认识,基本的身高、体重、年龄、性别,基本之外的语言、音色、国籍、肤色、视力、等等,这样我们可以把人理解为大千世界中一个高维度的事物。一个词也有多个维度,语种、笔画、含义、使用频率、长度、词性等等。鱼缸中的鱼,会有长短、大小、种类、重量、颜色、位置等等,降维可以理解为原本从5个或多个维度去认识这些鱼变成从2个维度去关注。原创 2023-10-21 09:51:36 · 217 阅读 · 0 评论 -
剑指offer JZ30 连续子数组的最大和
连续子数组的最大和输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).输入[1,-2,3,10,-4,7,2,-5]输出18 (3,10,-4,7,2 )public int FindGreatestSumOfSubArray(int[] array) { if (array.length==0 || array==null) { return 0;原创 2021-04-28 22:09:58 · 109 阅读 · 0 评论 -
剑指offer JZ29 最小的K个数
最小的K个数给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组简单思路先排序、再取最小的k个数public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> list = new ArrayList<Integer原创 2021-04-27 20:33:06 · 108 阅读 · 0 评论 -
剑指offer JZ28 数组中出现次数超过一半的数字
数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。public int MoreThanHalfNum_Solution(int [] array) { if(array == null || array.length == 0)return 0; int preValue = arra原创 2021-04-25 22:37:05 · 111 阅读 · 0 评论 -
剑指offer JZ27字符串的排序
字符串的排序输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。char[] carr ; int k=0; public ArrayList<String> Permutation(String str) { ArrayList<String> list = new ArrayList<String>();原创 2021-04-23 23:17:21 · 100 阅读 · 0 评论 -
剑指offer JZ26 二叉搜索树与双向链表
二叉搜索树与双向链表输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。这个题要奖励一朵小红花,一次提交就通过!public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree == null) return null; TreeNode temp; //递归把左子树转换为双向链表,返回根节点,通过根节点找出最大的节点,让节点的右指针指向当前节点,当前节点的左指针指向该节点原创 2021-04-21 23:00:31 · 138 阅读 · 0 评论 -
剑指offer JZ25 复杂的链表
复杂的链表输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)我的思考:什么是深拷贝?浅拷贝:拷贝对象的地址,修改后会影响原对象的属性;深拷贝则不影响原属性值对于这个题目,意思就是不能通过改变指针来实现,需要创建节点遍历链表,获取节点值创建新节点随机指针怎么处理?代码及思路public RandomListNo原创 2021-04-20 23:57:29 · 114 阅读 · 0 评论 -
剑指offer JZ24 二叉树中和为某一值的路径
二叉树中和为某一值的路径输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。案例输入:{10,5,12,4,7},22输出:[[10,5,7],[10,12]]代码//思路:深度优先遍历,如果累加值大于目标值则切换,如果到了路径末尾仍达不到 则切换路径//怎么添加到队列?ArrayList<ArrayList<Integer>> res = new ArrayLis原创 2021-04-16 22:28:48 · 165 阅读 · 0 评论 -
剑指offer JZ23 二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)思路突破点序列满足前一部分均小于最后一个值,后一部分均大于最后一个值,可以用两个while循环进行遍历如果遍历结束时到了最后一个位置则说明满足,最后一个位置前移,递归判断public boolean VerifySquenceOfBST(int [] sequence) { /原创 2021-04-14 21:40:31 · 177 阅读 · 0 评论 -
剑指 offer JZ22 从上往下打印二叉树
从上往下打印二叉树从上往下打印出二叉树的每个节点,同层节点从左至右打印。代码public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { ArrayList<Integer> list = new ArrayList<Integer>(); ArrayList<TreeNode> treelist = new ArrayList<TreeNode>();原创 2021-04-14 20:44:37 · 125 阅读 · 0 评论 -
剑指offer JZ20 包含min函数的栈
包含min函数的栈定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。代码public class Solution { Stack<Integer> stack = new Stack<Integer>();//栈需要泛型,不能是int Stack<Integer> minstack = new Stack<Integer>(); public void push(i原创 2021-04-14 20:15:21 · 93 阅读 · 0 评论 -
剑指offer JZ21 栈的压入弹出序列
栈的压入弹出序列输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路序列A欲加入的元素如果与序列B第一个相等,那么就后移指针,在栈的为空的情况下继续判断是否相等否则入栈public boolean IsPopOrder(int [] pushA,i原创 2021-04-14 14:05:22 · 135 阅读 · 0 评论 -
剑指offer JZ19 顺时针打印数组
顺时针打印数组输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.public ArrayList<Integer> printMatrix(int [][] matrix) { ArrayList<Integer> list = new Array原创 2021-04-13 22:47:23 · 113 阅读 · 0 评论 -
剑指offer JZ18二叉树的镜像
二叉树的镜像操作给定的二叉树,将其变换为源二叉树的镜像。源二叉树8/ 6 10/ \ / 5 7 9 11镜像二叉树8/ 10 6/ \ / 11 9 7 5思路一(未通过)public TreeNode Mirror (TreeNode pRoot) { // write code here //思路,递归返回值左右调换 // 考虑处理左右子树为空和其中一个为空的情况 Tr原创 2021-04-11 21:50:57 · 157 阅读 · 0 评论 -
剑指offer JZ17 树的子结构
树的子结构输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)输入{8,8,#,9,#,2,#,5},{8,9,#,2}输出true思路突破点递归判断是否完全相同(根节点值相等、左子树、右子树分别相同),B是否为A的左子树,B是否为A的右子树...原创 2021-04-09 23:24:18 · 213 阅读 · 0 评论 -
剑指offer JZ15 反转链表
反转链表输入一个链表,反转链表后,输出新链表的表头。思路递归public ListNode ReverseList(ListNode head) { //递归返回的是当前节点,最终结果需要头结点,如果处理? //在递归函数外面定义 不好处理 //每次都返回头结点,处理当前节点的链接即可 if(head == null||head.next == null) return head; ListNode no原创 2021-04-06 17:33:09 · 103 阅读 · 0 评论 -
剑指offer JZ16 合并两个排序的链表
合并两个排序的链表输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路递归public ListNode Merge(ListNode list1,ListNode list2) { if(list1 == null) return list2; if(list2 == null) return list1; if(list1.val<=list2.val){ list1.nex原创 2021-04-06 17:11:10 · 90 阅读 · 0 评论 -
剑指offer JZ14 链表中第k个结点
链表中第k个结点输入一个链表,输出该链表中倒数第k个结点。如果该链表长度小于k,请返回空。思路让第一个指针先走到k的位置,再两两个指针一起走,当第一个指针到达最后一个位置的时候,第二个指针就是倒数第k个public ListNode FindKthToTail (ListNode pHead, int k) { if(pHead==null||k==0) return null; // write code here原创 2021-04-05 21:06:43 · 89 阅读 · 0 评论 -
剑指offer JZ13 调整数组顺序使奇数位于偶数前
调整数组顺序使奇数位于偶数前输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路方法一:创建一个新数组,遍历两次,第一次把奇数添加进去,第二次把偶数添加进去public int[] reOrderArray (int[] array) { // write code here int arr[] = new int[array.length];原创 2021-04-04 22:14:03 · 132 阅读 · 0 评论 -
剑指offer JZ12 数值的整数次方
数值的整数次方给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0思路方法一: 正数直接累乘exp次就好了,负数取倒数累乘-exp次public double Power(double base, int exp) { if(exp == 0) return 1.0; if(exp<0){ base = 1/base; exp = -exp;原创 2021-04-02 16:01:11 · 111 阅读 · 0 评论 -
剑指offer JZ47 求1+2+3+...+n
求1+2+3+…+n求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。狗血,太狗血了!思路分析不能用for、while ,我居然没想到递归,确实,用递归写这种简单求和确实没写过。递归大方向是没错的,但是要求不能使用if、else、switch、case、A?B:C。if(n == 1 ) return 1; 这条语句就要想办法替换掉了解题n >1 && (n += Sum_Solu原创 2021-04-02 09:43:51 · 115 阅读 · 0 评论 -
剑指offer JZ11二进制中1的个数
二进制中1的个数输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。思路一通过除2取余,将余数存到数组中,分别对正负数进行处理。比较繁琐,容易出错,遗漏特殊情况思路二把十进制看成二进制,通过位与和移位,判断每一位是否为1怎么取移位的结果?方式一:n&1 这样就能取出最后一位,再循环右移n>>=1 (只能用于正数),这里用n>>>1即可解决方式二:(n-1)&n 这个操作可以将n二进制数最右边的一个1转为0,循环操作知道为0。原创 2021-04-02 09:07:15 · 106 阅读 · 0 评论 -
剑指offer JZ10 矩形覆盖
矩形覆盖我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2n的大矩形,总共有多少种方法?比如n=3时,23的矩形块有3种覆盖方法:思路覆盖第n个矩形,可以拆解为n-1个有多少种方法 + n-2 有多少种方法求n-2个矩形有多少种方法 这个比较难想到,想上图的下面那一步代码public class Solution { public int rectCover(int target) { /* 2*1 1种, 2*2 2种,原创 2021-03-31 23:58:03 · 130 阅读 · 0 评论 -
剑指offer JZ9 变态跳台阶
变态跳台阶一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。输入3输出4思路求前n级台阶的和,如果n等于4,那就分别求出从3、2、1、0跳上去的方案之和public class Solution { public int jumpFloorII(int target) { if(target == 1) return 1; if(target == 2) return 2;原创 2021-03-29 10:53:22 · 94 阅读 · 0 评论 -
剑指offer JZ8跳台阶
跳台阶题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。题意理解如果n = 2,那有两种方案n = 3,有3种方案n = 4,当然可以去列举所有的方案,但是,第4个台阶可以从第3个或者第2个一步跳上去,我们只需要知道第2、3台阶分别有多少种方案就可以了解题public class Solution { public int JumpFloor(int target) { if(target原创 2021-03-29 09:57:30 · 122 阅读 · 0 评论 -
剑指offer JZ6 旋转数组的最小数字
旋转数组的最小数字public class Solution { public int minNumberInRotateArray(int [] array) { //从旋转数组中找出最小值,跟一般的数组不同,该数组是两段有序的序列 //可以通过中间值与端点值的比较来确定被查找值的范围 //取中间值,与左端点值比较,如果大于,说明最小值在右边;如果小于说明在左边或者就是当前值 //接着再取中间值和左端点值比较,确定原创 2021-03-28 23:40:40 · 131 阅读 · 0 评论 -
剑指offer JZ5 两个栈实现队列
两个栈实现队列简单思路入队压栈就行,出队弹栈并压栈至另一个栈,直到为空,出队一个元素之后再压栈回去public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); public void push(int node) { stack1.add原创 2021-03-27 22:48:28 · 105 阅读 · 0 评论 -
剑指offer JZ4重建二叉树
重建二叉树题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。输入[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]返回值{1,2,5,3,4,6,7}思路根据前序数组第一个值,寻找根节点的位置。根据根节点的位置将前序和中序序列拆分成 左右子树的前、中序列利用递归,通过左子树的前、中序列原创 2021-03-26 00:02:18 · 96 阅读 · 0 评论 -
剑指offer JZ3 从尾到头打印链表
从尾到头打印链表输入一个链表,按链表从尾到头的顺序返回一个ArrayList。思路1、直接递归,如果下一个结点为空就添加当前节点元素,如果不为空就递归,回调之后添加当前元素2、遍历链表,将链表值添加到一个队列中利用集合的reverse()将队列反转(原理是首尾元素交换)从后往前遍历队列并添加到新队列中代码方法一:递归 if(listNode.next == null) //为空表示当前是最后一个元素,见结点值加入队列 list.add(listNode.val); else{ l原创 2021-03-24 23:35:59 · 142 阅读 · 0 评论 -
剑指offer JZ1二维数组中的查找
二维数组中的查找题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]输出:true思路二分查找思想:有序一维数组,取起始元素的中间值,与目标值比较,小于往左继续比较,大于往右继续比较切入点:找到初始比较元素,比较之后有两种对应处理方式解原创 2021-03-24 21:52:45 · 146 阅读 · 0 评论 -
一切皆有可能
活到100岁是可能的男人变女人是不可能的(矛盾体是可以相互转化的)在几百年前上九天揽月是不可能的30年后你成为中国首富是有可能的死的变成活的是不可能的黑的变成白的是可能的也有你认为不可能他认为可能我们怎么去判定一个事情是可能还是不可能呢?从个人层面讲可能与不可能就是见识没见识过的问题从社会层面讲就是现实生活中有没有依据的问题社会层面貌似比个人层面大,但社会可以看做一个个体,也就是说史无前例、也没有理论依据就是不可能以前不可能、现在可能,对于这个事情,回到几百年前它应该定义为可能还是不原创 2020-08-16 16:51:30 · 141 阅读 · 0 评论 -
心想事成:本质为心
心想事成心想事成的核心在于心,心中念念不忘、心中渴望咋一听“心想事成”怎么可能,这不过是一句祝福语罢了。但是回想我们所有成功的、实现的每一件事不过是心之所向,后有心动,最后实现。有人说我心里想着富有,想成为千万亿万富翁,我为什么就没有成呢?那是因为你并不是行想而是嘴上说说而已,没有走心、没有渴望。你当你一天两天得不到的时候,你觉得不用那么富有也很好,过着一般的生活也就算了。你的心已经向着当...原创 2020-04-09 13:11:25 · 252 阅读 · 1 评论 -
“招之即来,挥之即去”——链表
链表链表:相对于数组,也就长度不固定,添加元素不用重建链表,插入、删除方便与C语言的比较从链表到队列class Node {Object data;Node next;}原创 2019-07-23 00:24:19 · 243 阅读 · 0 评论 -
面向对象的理解及在生活中的思考
对于面向对象的理解对象是个体,是具体某一件事物,如我的电脑、这个桌子、我通过努力学习拼搏拿到了百度的offer…对象是由类实例化而来的,这样一句话是不是适用于生活中的一切对象呢?一台汽车也是有一个类实例化而来的,这个类有属性和方法属性:汽车的组成零件(螺丝、灯、颜色、发动机、、、)方法:使用油门、离合、刹车、档位控制的方法在生活中的思考一切事物都是对象,那么每个对象都有一个类与之对应...原创 2019-04-05 23:21:54 · 888 阅读 · 1 评论