局部变量与全局变量
局部变量与全局变量
变量的作用域
基本数据类型变量与引用数据类型变量
变量的作用域Java中变量的作用域可以分为四个级别:类级(类变量),对象实例级(实例变量),方法级(局部变量),块级(局部变量)
类型
从属于
声明位置
作用域
初始化
类变量(静态变量)
类
类内部,方法外,static修饰
与类同在,类被加载静态变量就有效,直至类被回收机制回收时消失
必须先声明、初始化,才能使用
成员变量(实例变量)
对象实例
类内部,方法外
有对应的实例对象创建时创建成员变量;对象消失时,成员变量消失
不用自行初始化,默认初始值
局部变量
方法 / 代码块
方法中或代码块内
从声明时开始,到所在的方法或代码块执行完毕时消失
不用自行初始化,默认初始值
// 实例代码:
public class Variable {
// 静态变量 想使用这类变量,直接 类名.参数名
static String staticVariable = "我是静态变量";
// 实例变量 想使用要先创建实例对象,如果不初始化,S ...
Day18_平衡树_剑指Offer
二叉树的深度Easy 原题连接:二叉树的深度
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
示例:
3
/ \
9 20
/ \
15 7
返回:3
限制:
节点总数 <= 10000
解题思路获得二叉树最大深度,可以叫二叉树自根节点遍历至每一个子节点,记录最大深度并返回
也可以拆分任务:获得每一个子节点的最大深度并返回
对于每一个节点而言,获取其左右节点的深度,取大值 + 1 ( 当前节点 ) 并返回
需要额外考虑的就是叶子节点,当前遍历到叶子节点时,判断左右为null的分支深度为0即可
Java代码/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; ...
Day17_数组排序2_剑指Offer
最小的k个数Esay 原题连接:最小的k个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
输入:arr = [0,1,2,1], k = 1
输出:[0]
限制:
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000
解题思路排序输出前k位,取决于你希望使用哪一种算法实现排序,有现成的自然是最快的
Java代码class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
int[] ans = new int[k];
Arrays.sort(arr);
for(int i=0; i<k; i++){
...
Day16_数组排序_剑指Offer
把数组排成最小的数medium 原题连接:把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例:
输入: [10,2]
输出: "102"
输入: [3,30,34,5,9]
输出: "3033459"
限制:
0 < nums.length <= 100
输出结果可能非常大,所以你需要返回一个字符串而不是整数
拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
解题思路返回凭借的最小字符(数值),按题目示例来看,我们需要将数组高位代表的值尽可能小的排字符前方,比如同样长度,以3开头一定小于以5开头,同时也需要后
几位尽可能的小,如 3 和 30 可以组合 330 和 303,30的个位0位于组合后的十位显然比位于组合都的个位更小
简而言之,需要我们自行给数组按特定要求排序
实现数与数的对比,能够量化一种标准判断排序要求
特定要求:xy > yx 时,y在前,x在后,判断返回大值
实现:构建StringBuilder类,实现 x ...
Day15_树的遍历_剑指Offer
二叉树中和为某一值的路径medium 原题连接:二叉树中和为某一值的路径
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
输入:root = [1,2,3], targetSum = 5
输出:[]
输入:root = [1,2], targetSum = 0
输出:[]
限制:
树中节点总数在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
解题思路明确题目要求,叶子节点到根节点的路径和为target
写入结果判断需要满足:是叶子节点(now.left == null && now.ri ...
剑指Offer_Day14_递归遍历
矩阵中的路径medium 原题连接:矩阵中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用
示例:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
输入:board = [["a","b"],["c","d"]], word = "abcd"
输出: ...
leetcode剑指Offer第十三天
调整数组顺序使奇数位于偶数前面Easy 原题连接:调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
限制:
0 <= nums.length <= 50000`
0 <= nums[i] <= 10000
解题思路双指针,一头一尾向中间遍历,满足前为奇数头指针后移,满足后为偶数尾指针前移,直到两个都不可移动,交换到两个指针相交
Java代码class Solution {
public int[] exchange(int[] nums) {
int n = nums.length, i = 0, j = n-1;
while(i<j) {
while(i < n && nu ...
leetcode剑指Offer第十二天
合并两个排序的链表Easy 原题连接:合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
限制:
0 <= 链表长度 <= 1000
解题思路并行比较两边的大小,依次遍历相接
对于判空,用于开始判空,如果原本的 l1 或 l2 就存在空,直接返回。也可以在遍历时,其中一边已经完成遍历全部进入排序,判空使剩下数组快速进入排序
对于比大小,首次比大小决定是使用 l1 还是 l2 作为最后组合排序的结果返回,后续遍历作为后接链表的判断
Java代码/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* ...
leetcode剑指Offer第十一天
删除链表的节点Easy 原题连接:删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
示例:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
限制:
题目保证链表中节点的值互不相同
若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
解题思路链表中删除一个节点,要当前节点的上一个节点的next指向当前节点的next,如:1 → 2 → 4 删去 2 ,需要将 1 ( 2的上指针 )的next指针指向 4 ( 2的next所指 )
为了避免第一个值就是所需删除的值(不存在上一节点),可以直接返回next
时间复杂度:O( N ) ...