<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[coder_flag的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/coder_flag</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; coder_flag]]></copyright><item><title><![CDATA[使用线程池优化sdk调用流程]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/104437474</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/104437474</guid><author>coder_flag</author><pubDate>Sat, 22 Feb 2020 01:04:38 +0800</pubDate><description><![CDATA[场景：
  现有一个人脸检测算法sdk包（C++），使用java中的jni调用该sdk提供出java可直接调用的接口，并打包成jar包（作为依赖包）供业务系统调用。
  人脸算法执行流程为：（1）加载lisence -&gt; (2)初始化FaceDetect、FaceAttribute 等对象 -&gt; (3)传入图片数据进行检测  。 其中第一步加载lisence在整个系统的生命周期中，只需...]]></description><category></category></item><item><title><![CDATA[24.两两交换链表中的节点]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/92848311</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/92848311</guid><author>coder_flag</author><pubDate>Wed, 19 Jun 2019 21:50:13 +0800</pubDate><description><![CDATA[给定一个链表，两两交换其中相邻的节点，并返回交换后的链表。
你不能只是单纯的改变节点内部的值，而是需要实际的进行节点交换。
示例：

给定 1-&gt;2-&gt;3-&gt;4, 你应该返回 2-&gt;1-&gt;4-&gt;3.

递归解法：
public ListNode swapPairs(ListNode head) {
        if(head==null || head.ne...]]></description><category></category></item><item><title><![CDATA[层序遍历二叉树类型]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/92439592</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/92439592</guid><author>coder_flag</author><pubDate>Sun, 16 Jun 2019 23:12:15 +0800</pubDate><description><![CDATA[1.从上往下打印二叉树（层序遍历）

题目： 往下打印出二叉树的每个节点，同层节点从左至右打印。

思路：使用队列的先进先出的特性，在把队列中的节点取出同时把它的儿子插入队列，从而实现按层顺序打印。
 //层序遍历
    public ArrayList&lt;Integer&gt; PrintFromTopToBottom(TreeNode root) {
        Queue&lt;T...]]></description><category></category></item><item><title><![CDATA[二叉树的下一个结点]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/92231529</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/92231529</guid><author>coder_flag</author><pubDate>Sat, 15 Jun 2019 23:09:57 +0800</pubDate><description><![CDATA[题目：
给定一个二叉树和其中的一个结点，请找出中序遍历顺序的下一个结点并且返回。注意，树中的结点不仅包含左右子结点，同时包含指向父结点的指针。
解法：

如图所示，可以归纳出两种情况：1）给定节点有右儿子，则下一个节点是右儿子的最左边儿子    ，2）给点节点没有右儿子，则一直找到当前节点的父节点是其父节点的左儿子的节点，比如（j,H 节点）。

代码如下：
class TreeLinkNode ...]]></description><category></category></item><item><title><![CDATA[把数组排成最小的数]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90438996</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90438996</guid><author>coder_flag</author><pubDate>Wed, 22 May 2019 10:30:27 +0800</pubDate><description><![CDATA[题目描述
输入一个正整数数组，把数组里所有数字拼接起来排成一个数，打印能拼接出的所有数字中最小的一个。例如输入数组{3，32，321}，则打印出这三个数字能排成的最小数字为321323。

思路
因为前几天刷过这道题：字符串的顺序排列，想到其实这题做法也是排列组合出各种可能的数字，然后比较大小，取其最小的即可。


public class Solution {
    
    //输入一个正整...]]></description><category></category></item><item><title><![CDATA[整数中1出现的次数（从1到n整数中1出现的次数）]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90437790</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90437790</guid><author>coder_flag</author><pubDate>Wed, 22 May 2019 09:44:11 +0800</pubDate><description><![CDATA[题目描述
求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数？为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数（从1 到 n 中1出现的次数）。

思路：
主要思路就是把数字转成字符串来处理，对每个数字字符串遍历期中1的个数...]]></description><category></category></item><item><title><![CDATA[最小的k个数]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90437285</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90437285</guid><author>coder_flag</author><pubDate>Wed, 22 May 2019 09:20:19 +0800</pubDate><description><![CDATA[题目描述
输入n个整数，找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字，则最小的4个数字是1,2,3,4,。

思路：
构建一个k大小的大根堆，遍历input数组，在堆未满时，直接存入元素，在堆已满时，则比较堆顶元素与带插入元素，若带插入元素更小，则替换堆顶元素。


import java.util.ArrayList;
import java.util.Comparat...]]></description><category></category></item><item><title><![CDATA[字符串顺序排列]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90403736</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90403736</guid><author>coder_flag</author><pubDate>Tue, 21 May 2019 11:33:23 +0800</pubDate><description><![CDATA[题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路：
题目咋一看没思路，可以尝试着写几个字符串，推导一下各种可能，然后从中找找思路。比如abc 的组合，先想以a开头，以b开头，以c开头，在确定好了第一个字母的前提下，再按同样的步骤，确定第二个字母，以此类推。
...]]></description><category></category></item><item><title><![CDATA[二叉搜索树与双向链表]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90299512</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90299512</guid><author>coder_flag</author><pubDate>Fri, 17 May 2019 19:48:29 +0800</pubDate><description><![CDATA[题目描述
输入一棵二叉搜索树，将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点，只能调整树中结点指针的指向。
思路：
开局一张图。。。。其实主要就是按照中序遍历的过程，把树的节点递归连接成双向链表。

public class Convert {

    public class TreeNode {
        int val = 0;
        TreeNode l...]]></description><category></category></item><item><title><![CDATA[复杂链表的复制]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90268423</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90268423</guid><author>coder_flag</author><pubDate>Thu, 16 May 2019 17:40:26 +0800</pubDate><description><![CDATA[题目：
输入一个复杂链表（每个节点中有节点值，以及两个指针，一个指向下一个节点，另一个特殊指针指向任意一个节点），返回结果为复制后复杂链表的head。（注意，输出结果中请不要返回参数中的节点引用，否则判题程序会直接返回空）

思路：
1.先把每个节点复制出一个节点并把每个复制出的节点连接到原来节点后面
2.把原来每个节点的random指针复制到对应复制出的节点上
3.把每个复制出来的节点分离出来
...]]></description><category></category></item><item><title><![CDATA[在O（1）时间删除链表结点]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90268292</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90268292</guid><author>coder_flag</author><pubDate>Thu, 16 May 2019 17:36:00 +0800</pubDate><description><![CDATA[题目：
给定单向链表的头指针和一个结点指针，定义一个函数在O（1）时间删除该结点。

思路：
主要是在链表是多节点并且要删除的节点非尾部节点时，可以使要删除的节点的下一个节点的值覆盖掉要删除节点的值，然后删除下一个节点，这个操作是O（1）复杂度，而删除节点为头节点是O（1）复杂度 ，删除节点为尾部节点的时间复杂度是O（n）。  所以O(1)时间复杂度 ： （ O(1)*(n-1) + O(n) ）...]]></description><category></category></item><item><title><![CDATA[归并排序]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90243316</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90243316</guid><author>coder_flag</author><pubDate>Wed, 15 May 2019 19:36:46 +0800</pubDate><description><![CDATA[思想：
归并排序（MERGE-SORT）是利用归并的思想实现的排序方法，该算法采用经典的分治（divide-and-conquer）策略（分治法将问题分(divide)成一些小的问题然后递归求解，而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起，即分而治之)。
算法复杂度为 O(nlogn) 级别
public class MergeSort {

    public stat...]]></description><category></category></item><item><title><![CDATA[堆排序]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90243275</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90243275</guid><author>coder_flag</author><pubDate>Wed, 15 May 2019 19:33:47 +0800</pubDate><description><![CDATA[思想：
堆排序最主要在于构建堆这个数据结构上，构建好堆后，排序工作主要是插入，取出等操作。堆排序是一种选择排序，它的最坏，最好，平均时间复杂度均为O(nlogn)，它也是不稳定排序。
构建堆的两个最主要操作是 shiftUp（） 、 shiftDown（）。

public class QuickSort {

    public static void sort(int[] arr) {
  ...]]></description><category></category></item><item><title><![CDATA[快速排序]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90243193</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90243193</guid><author>coder_flag</author><pubDate>Wed, 15 May 2019 19:28:19 +0800</pubDate><description><![CDATA[思想：
通过一趟排序将要排序的数据分割成独立的两部分，其中一部分的所有数据都比另外一部分的所有数据都要小，然后再按此方法对这两部分数据分别进行快速排序，整个排序过程可以递归进行，以此达到整个数据变成有序序列

public class QuickSort {

    public static void sort(int[] arr) {
        quickSort(arr, 0, ar...]]></description><category></category></item><item><title><![CDATA[插入排序]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90243169</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90243169</guid><author>coder_flag</author><pubDate>Wed, 15 May 2019 19:26:05 +0800</pubDate><description><![CDATA[思想：  直接插入排序基本思想是每一步将一个待排序的记录，插入到前面已经排好序的有序序列中去，直到插完所有元素为止。
public class InsertSort {

    public static void sort(int[] arr) {
        for (int i = 0; i &lt; arr.length - 1; i++) {
            for (in...]]></description><category></category></item><item><title><![CDATA[选择排序]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90243154</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90243154</guid><author>coder_flag</author><pubDate>Wed, 15 May 2019 19:24:27 +0800</pubDate><description><![CDATA[思想：  简单选择排序是最简单直观的一种算法，基本思想为每一趟从待排序的数据元素中选择最小（或最大）的一个元素作为首元素，直到所有元素排完为止，简单选择排序是不稳定排序。

public class SelectSort {

    public static void sort(int[] arr) {
        for (int i = 0; i &lt; arr.length; i+...]]></description><category></category></item><item><title><![CDATA[冒泡排序]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90243125</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90243125</guid><author>coder_flag</author><pubDate>Wed, 15 May 2019 19:22:01 +0800</pubDate><description><![CDATA[思想：　冒泡排序的基本思想是，对相邻的元素进行两两比较，顺序相反则进行交换，这样，每一趟会将最小或最大的元素“浮”到顶端，最终达到完全有序

public class BubleSort {

    public  static  void sort(int[] arr){
        for(int i =0 ;i&lt;arr.length ;i++){
            bool...]]></description><category></category></item><item><title><![CDATA[栈的压入、弹出序列]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90235921</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90235921</guid><author>coder_flag</author><pubDate>Wed, 15 May 2019 14:25:22 +0800</pubDate><description><![CDATA[题目描述
输入两个整数序列，第一个序列表示栈的压入顺序，请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序，序列4,5,3,2,1是该压栈序列对应的一个弹出序列，但4,3,5,1,2就不可能是该压栈序列的弹出序列。（注意：这两个序列的长度是相等的）
思路： 利用一个辅助栈空间，根据第二个弹出序列来对整个压栈过程进行模拟。
public...]]></description><category></category></item><item><title><![CDATA[从上往下打印二叉树]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90179830</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90179830</guid><author>coder_flag</author><pubDate>Mon, 13 May 2019 19:36:11 +0800</pubDate><description><![CDATA[题目描述
从上往下打印出二叉树的每个节点，同层节点从左至右打印。(层序遍历)
思路： 使用队列这种数据结构，利用先进先出这种特性。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

public class PrintFromTopToBottom {

    public clas...]]></description><category></category></item><item><title><![CDATA[调整数组顺序使奇数位于偶数前面]]></title><link>https://blog.youkuaiyun.com/coder_flag/article/details/90108359</link><guid>https://blog.youkuaiyun.com/coder_flag/article/details/90108359</guid><author>coder_flag</author><pubDate>Sat, 11 May 2019 13:01:59 +0800</pubDate><description><![CDATA[题目描述
输入一个整数数组，实现一个函数来调整该数组中数字的顺序，使得所有的奇数位于数组的前半部分，所有的偶数位于数组的后半部分，并保证奇数和奇数，偶数和偶数之间的相对位置不变。

自己思路：
感觉这是直接一眼想到的思路。有什么错误求指正！！谢谢
使用列表存储偶数，然后把所有奇数顺序移到数组前面，剩余空间放入列表中的偶数。时间复杂度是O(n),空间复杂度也是O(n)
（空间复杂度应该可以优化，先判...]]></description><category></category></item></channel></rss>