www.91084.com

GVKun编程网logo

剑指Offer-59.按之字形顺序打印二叉树(C++/Java)(之字形打印二叉树 java)

2

对于想了解剑指Offer-59.按之字形顺序打印二叉树(C++/Java)的读者,本文将提供新的信息,我们将详细介绍之字形打印二叉树java,并且为您提供关于1.找出数组中重复的数字----《剑指Of

对于想了解剑指Offer-59.按之字形顺序打印二叉树(C++/Java)的读者,本文将提供新的信息,我们将详细介绍之字形打印二叉树 java,并且为您提供关于1.找出数组中重复的数字 ----《剑指Offer》题解(Java)、java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结、JZ-059-按之字形顺序打印二叉树、JZ59-按之字形顺序打印二叉树的有价值信息。

本文目录一览:

剑指Offer-59.按之字形顺序打印二叉树(C++/Java)(之字形打印二叉树 java)

剑指Offer-59.按之字形顺序打印二叉树(C++/Java)(之字形打印二叉树 java)

题目:

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

分析:

实际上是二叉树的层次遍历,只不过每一行输出的方向都是相反的,每遍历二叉树的结点时,都将其内的每一个结点的左右孩子都保存好,设置一个标志,ture时就正序输出,false就逆序输出val,直到所有的结点都打印完即可。

程序:

C++

class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        if(pRoot == nullptr)
            return res;
        vector<TreeNode*> printS;
        vector<TreeNode*> temp;
        printS.push_back(pRoot);
        bool flag = true;
        while(!printS.empty()){
            //vector<TreeNode*> temp;
            vector<int> resTemp;
            for(auto i:printS){
                if(i->left != nullptr)
                    temp.push_back(i->left);
                if(i->right != nullptr)
                    temp.push_back(i->right);
            }
            if(flag){
                for(int i = 0; i < printS.size(); ++i)
                    resTemp.push_back(printS[i]->val);
            }
            else{
                for(int i = printS.size()-1; i >= 0; --i)
                    resTemp.push_back(printS[i]->val);
            }
            flag = !flag;
            res.push_back(resTemp);
            printS.swap(temp);
            temp.clear();
        }
        return res;
    }
private:
    vector<vector<int>> res;
};

Java

import java.util.ArrayList;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        if(pRoot == null)
            return res;
        ArrayList<TreeNode> printS = new ArrayList<>();
        ArrayList<TreeNode> temp = new ArrayList<>();
        boolean flag = true;
        printS.add(pRoot);
        while(!printS.isEmpty()){
            ArrayList<Integer> resTemp = new ArrayList<>();
            for(TreeNode i:printS){
                if(i.left != null)
                    temp.add(i.left);
                if(i.right != null)
                    temp.add(i.right);
            }
            if(flag){
                for(int i = 0; i < printS.size(); ++i)
                    resTemp.add(printS.get(i).val);
            }
            else{
                for(int i = printS.size()-1; i >= 0; --i)
                    resTemp.add(printS.get(i).val);
            }
            flag = !flag;
            res.add(resTemp);
            printS.clear();
            printS.addAll(temp);
            temp.clear();
            resTemp = null;
        }
        return res;
    }
    private ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
}

1.找出数组中重复的数字 ----《剑指Offer》题解(Java)

1.找出数组中重复的数字 ----《剑指Offer》题解(Java)

题目

给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内。

数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。

请找出数组中任意一个重复的数字。

注意:如果某些数字不在 0∼n−1 的范围内,或数组中不包含重复数字,则返回 -1;

样例 给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。

返回 2 或 3。

##算法思路 找重复数字可以直接用HashMap来解决,但需要额外的空间。 本题可以只用O(1)的空间复杂度来实现,具体思路是: 由于数字范围是[0, n-1],数组长度是n,因此可把数组当做是数字的槽位,依次将数字放到对应数组下标的位置去。 遍历数组,将当前元素nums[i]放到它对应的数组下标的位置去,即swap(nums[i] , nums[nums[i]]),注意交换到位置i的数字也要继续放到它相应的槽去,依次循环直到当前位置i放入了正确的数字,即nums[i] == i。 假如在将当前位置的元素放到正确位置的时候,发现该位置已经是正确的数字了,说明有重复,直接返回该数字即可。 需要注意,题目中“如果某些数字不在 0∼n−1 的范围内,则返回 -1”,这是个坑,需要提前判断,如果在遍历数组中判断则可能先找到重复元素,就退出,超出范围的数还没被判断到。 算法的时间复杂度是O(n)

##代码实现

class Solution {
    public int duplicateInArray(int[] nums) {
        if (nums == null || nums.length == 0) return -1;
        int n = nums.length;
        //提前遍历判断"如果某些数字不在 0∼n−1 的范围内,则返回 -1"
        for (int i=0; i<n; i++) { 
            if (!(nums[i] >= 0 && nums[i] < n)) return -1;
        }
        
        for (int i=0; i<n; i++) {
            //循环将当前位置的元素放到对应的槽去
            while (nums[i] != nums[nums[i]]) swap(nums, i, nums[i]); 
            
            //当前元素应该放到对应位置,但该位置的数字跟当前的一样,即重复了
            if (nums[i] != i && nums[i] == nums[nums[i]]) return nums[i]; 
        }
        
        return -1;
    }
    
    //交换数组两个元素
    private void swap(int[] nums, int i, int j) {
        nums[i] = nums[i] ^ nums[j];
        nums[j] = nums[i] ^ nums[j];
        nums[i] = nums[i] ^ nums[j];
    }
}

java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结

java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结

     

在 web 开发中,避免不了对日期的操作,就几种常见的日期操作做个总结 (部分参考网络,在此表示感谢):

java.util.Date、Java.util.Calendar、java.sql.Date、java.sql.Time、java.sql.Timestamp

 

java.lang.Object 
....|__java.util.Date 
..........|__java.sql.Date/java.sql.Timestamp /java.sql.Time

....|__java.security.Timestamp

 

java.util.Date 日期格式为:年月日时分秒 
java.sql.Date 日期格式为:年月日 [只存储日期数据不存储时间数据] 
java.sql.Time 日期格式为:时分秒 
java.sql.Timestamp 日期格式为:年月日时分秒纳秒(毫微秒)

关系:

    java.util.Date 这个类是 java.sql.Date,  java.sql.Time,  java.slq.Timestamp 这三个类的父类。这三个类对 java.util.Date 类进行了包装。

联系:

    java.sql.Date 类屏蔽了 java.util.Date 类的时间有关的方法(形如:hh:mm:ss), 因此,不可以通过这个类访问时间有关的信息,比如,如果你通过 sqlDate.getHour () 方法去访问小时信息,此方法会抛出一个 IllegalArgumentException异常。这是因为java.sql.Date在继承java.util.Date类的时候对父类进行了重写,禁用了时间访问的方法。之所以这么处理,是为了和数据库的Date数据类型相匹配,数据库的Date数据类行只是保存日期有关的字段。

    Java.sql.Time 类屏蔽了 java.util.Date 的日期有关的字段(形如:yyyy-MM-dd), 因此,不能通过这个类访问日期有关的信息,比如:如果你通过 sqlTime.getYear () 方法去获取年有关的信息,此方法会抛出一个 IllegalArgumentException异常。这是因为java.sql.Time在继承java.util.Date类的时候对父类进行了重写,禁用了日期访问的方法。之所以这么处理,是为了和数据库的Time数据类型相匹配,数据库的Time数据类行只是保存时间有关的字段。

  Java.sql.Timestamp字段则对java.util.Date这个类进行了扩充,它在java.util.Date类的基础上增加了毫秒的时间访问控制,因此,你可以通过 getNanos()方法去获取时间的毫微秒数(注意此处获取的时间是以毫微秒为单位的,1 秒等于十亿毫微秒),同样的,这也是为了和数据库中的 Timestamp 数据类型进行匹配。

理清了上述四个类的关系,那么 java.util.Date 和 java.util.Calendar 类有什么关系呢?

   Java.util.Calendar 类是 java.util.Date 类的一个更加深入,更加全面的替代。Java.util.Calendar 类支持 java.util.Date 的所有功能,此外,Calendar 还引入了多语言,多区域的特性,可以根据需要获取不同区域,不同时区的时间,Calendar 还增加了比 Date 更加方便和快捷的许多操作,如获取一年当中的第几个星期,各个月的天数等便捷的方法。

 

注意:

Java.util.Calendar 区别与 java.util.Date 的几个地方也需要注意一下:首先,Calendar 增加了毫秒的时间段,通过它可以获取时间点的毫秒值,而 java.util.Date 只是精确到秒。其次,Calendar 过去年的时候是当前年份比如:2010,而 Date 获取年份的时获取到的是当前年份 - 1900 的一个值(2010-1900=110,因此,你调用 getYear 后过去的值就是 110)。最后 Calendar 是一个抽象类,之所以能够实例化,是因为此处的 Calendar 充当了一个类似于工厂的作用,在 getInstance 方法中实例化了 Calendar 子类 GregorianCalendar,并把它返回给用户使用。

 

针对不同的数据库选用不同的日期类型 
・Oracle 的 Date 类型,只需要年月日,选择使用 java.sql.Date 类型 
・MS Sqlserver 数据库的 DateTime 类型,需要年月日时分秒,选择 java.sql.Timestamp 类型

 

String 日期格式转换成 Date 日期格式

//java.util.Date 时间格式的转换
    SimpleDateFormat f_utilDate=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  String str="2011-5-31 14:40:50";
  try {
   java.util.Date utilDate=f_utilDate.parse(str);
   System.out.println(f_utilDate.format(utilDate));
  } catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

    //java.sql.Date 时间格式的转换
    SimpleDateFormat f_sqlDate=new SimpleDateFormat("yyyy-MM-dd");
    java.sql.Date sqlDate = java.sql.Date.valueOf("2010-08-20");
    System.out.println(f_sqlDate.format(sqlDate));
    
    //java.sql.Time sqltime 时间格式的转换
    SimpleDateFormat f_sqlTime=new SimpleDateFormat("hh:mm:ss");
    java.sql.Time sqltime = java.sql.Time.valueOf("13:44:53"); 
    System.out.println(f_sqlTime.format(sqltime));
    
    //java.sql.Timestamp 时间格式的转换
    SimpleDateFormat f_timestamp=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
    java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2010-08-20 14:06:27.186"); 
    System.out.println(f_timestamp.format(timestamp));

 

 //java.util.Date 转换成 java.sql.Date 格式
       try{
        SimpleDateFormat DateFormate =   new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
               java.util.Date date1 = DateFormate.parse("2011-5-31 14:40:50");
               java.sql.Date sqlDate = new java.sql.Date(date1.getTime());
               System.out.println(DateFormate.format(sqlDate));
       }catch (Exception ex) {
            System.out.println(ex.getMessage());
       }

       //java.sql.Date 转换成 java.util.Date 格式
       java.sql.Date sqlDate1=java.sql.Date.valueOf("2005-12-12");
       java.util.Date utilDate1=new java.util.Date(sqlDate1.getTime());
       System.out.println ("java.sql.Date 转换成 java.util.Date 格式:"+f.format (utilDate1));

    //java.util.Date 转换 java.sql.Timestamp 
    new java.sql.Timestamp (new java.util.Date ().getTime ());// 此处 IDE 报错

    //java.util.Date 转换 java.sql.Time 
    new java.sql.Time(new java.util.Date().getTime());

    

    Timestamp timestamp  = new Timestamp(System.currentTimeMillis());

   我们可以使用 DateFormat 处理字符串来定义时间日期的格式 
   注:String 都是先转换为 java.util.Date,然后再转换成所需的格式

try{   
             String dateString = "2010-08-20 12:00:00.125";    
              DateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd kk:mm:ss.SSS",Locale.ENGLISH);// 设定格式   
             dateFormat.setLenient(false);   
             java.util.Date utilDate = dateFormat.parse (dateString);//util 类型   
             java.sql.Timestamp dateTime = new java.sql.Timestamp (utilDate.getTime ());//Timestamp 类型,timeDate.getTime () 返回一个 long 型   
             System.out.println(dateTime);   
        }catch(Exception ex){   
            ex.printStackTrace();   
        }        

 

Java MySQL 数据类型对照

类型名称 显示长度 数据库类型 JAVA 类型 JDBC 类型索引 (int) 描述
           
VARCHAR L+N VARCHAR java.lang.String 12  
CHAR N CHAR java.lang.String 1  
BLOB L+N BLOB java.lang.byte[] -4  
TEXT 65535 VARCHAR java.lang.String -1  
           
INTEGER 4 INTEGER UNSIGNED java.lang.Long 4  
TINYINT 3 TINYINT UNSIGNED java.lang.Integer -6  
SMALLINT 5 SMALLINT UNSIGNED java.lang.Integer 5  
MEDIUMINT 8 MEDIUMINT UNSIGNED java.lang.Integer 4  
BIT 1 BIT java.lang.Boolean -7  
BIGINT 20 BIGINT UNSIGNED java.math.BigInteger -5  
FLOAT 4+8 FLOAT java.lang.Float 7  
DOUBLE 22 DOUBLE java.lang.Double 8  
DECIMAL 11 DECIMAL java.math.BigDecimal 3  
BOOLEAN 1 同 TINYINT      
           
ID 11 PK (INTEGER UNSIGNED) java.lang.Long 4  
           
DATE 10 DATE java.sql.Date 91  
TIME 8 TIME java.sql.Time 92  
DATETIME 19 DATETIME java.sql.Timestamp 93  
TIMESTAMP 19 TIMESTAMP java.sql.Timestamp 93  
YEAR 4 YEAR java.sql.Date 91





 

 

对于 bolb,一般用于对图片的数据库存储,原理是把图片打成二进制,然后进行的一种存储方式,在 java 中对应 byte[]数组。

 

对 Boolean 类型的解释

mysql 不支持 bool 类型。

1

2

3

4

5

create table xs

(

id int primary key,

bl boolean

)

这样可以创建成功,但检查表结构会发现 mysql 把它替换成 tinyint (1)。

即当把一个数据设置成 bool 类型的时候,数据库会自动转换成 tinyint (1) 的数据类型,其实这个就是变相的 bool。 默认值也就是 1,0 两种,分别对应了 bool 的 true 和 false

在 Java 对应的 POJO 类中,可以根据实际情况使用 java.lang.Boolean 或者 java.lang.Integer。

转自:

http://langgufu.iteye.com/blog/2202744

https://yq.aliyun.com/articles/38115

JZ-059-按之字形顺序打印二叉树

JZ-059-按之字形顺序打印二叉树

按之字形顺序打印二叉树

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

题目链接: 按之字形顺序打印二叉树

代码

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

/**
 * 标题:按之字形顺序打印二叉树
 * 题目描述
 * 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
 * 题目链接:
 * https://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0?tpId=13&&tqId=11212&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
 */
public class Jz59 {

    public ArrayList<ArrayList<Integer>> print(TreeNode pRoot) {
        Queue<TreeNode> treeNodes = new LinkedList<>();
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        treeNodes.add(pRoot);
        boolean flag = true; // 当flag为true时,栈从左向右放;当flag为false时,栈从右向左放
        while (!treeNodes.isEmpty()) {
            int cnt = treeNodes.size();
            ArrayList<Integer> curList = new ArrayList<>();
            Stack<TreeNode> curNodes = new Stack<>();
            while (cnt-- > 0) {

                TreeNode t = treeNodes.poll();
                if (t == null) {
                    continue;
                }
                curList.add(t.val);
                if (flag) {
                    curNodes.add(t.left);
                    curNodes.add(t.right);
                } else {
                    curNodes.add(t.right);
                    curNodes.add(t.left);
                }
            }
            flag = !flag;
            while (!curNodes.isEmpty()) {
                treeNodes.add(curNodes.pop());
            }
            if (!curList.isEmpty()) {
                result.add(curList);
            }
        }
        return result;
    }

    public static void main(String[] args) {

    }
}
【每日寄语】 只要你今天再多努力一下,那个未来可以像星星一样闪闪发光的人就是你呀!

JZ59-按之字形顺序打印二叉树

JZ59-按之字形顺序打印二叉树

题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

思路:

  1. 主要的方法与BFS写法没什么区别
  2. BFS里是每次只取一个,而我们这里先得到队列长度size,这个size就是这一层的节点个数,然后通过for循环去poll出这size个节点,这里和按行取值二叉树返回ArrayList<ArrayList<Integer>>这种题型的解法一样,之字形取值的核心思路就是通过两个方法:
    • list.add(T): 按照索引顺序从小到大依次添加
    • list.add(index, T): 将元素插入index位置,index索引后的元素依次后移,这就完成了每一行元素的倒序,或者使用Collection.reverse()方法倒序也可以

 

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        LinkedList<TreeNode> q = new LinkedList<>();
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        boolean rev = true;
        q.add(pRoot);
        while(!q.isEmpty()){
            int size = q.size();//大小
            ArrayList<Integer> list = new ArrayList<>();
            for(int i=0; i<size; i++){
                TreeNode node = q.poll();
                if(node == null){
                    continue;
                }
                if(rev){
                    list.add(node.val);
                }else{
                    list.add(0, node.val);
                }
                q.offer(node.left);//入队
                q.offer(node.right);//入队
            }
            if(list.size()!=0){
                res.add(list);
            }
            rev=!rev;
        }
        return res;
    }
}

 

关于剑指Offer-59.按之字形顺序打印二叉树(C++/Java)之字形打印二叉树 java的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于1.找出数组中重复的数字 ----《剑指Offer》题解(Java)、java 中的日期类型:java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp 区别和总结、JZ-059-按之字形顺序打印二叉树、JZ59-按之字形顺序打印二叉树的相关信息,请在本站寻找。

本文标签: