劍指Offer之java版

題目1:設(shè)計(jì)一個(gè)類越走,我們只能生成該類的一個(gè)實(shí)例
//雙檢鎖/雙重校驗(yàn)鎖(DCL澜汤,即 double-checked locking)
public class Singleton {
private volatile static Singleton sInstance = null;

private Singleton() {

}

public static Singleton getInstance() {
    if (sInstance == null) {
        synchronized (Singleton.class) {
            if (sInstance == null) {
                sInstance = new Singleton();
            }
        }
    }
    return  sInstance;
}
}
題目2:找出數(shù)組中的重復(fù)數(shù)字械筛,時(shí)間復(fù)雜度O(n)
//對于一維數(shù)組排序滿足O(n)時(shí)間復(fù)雜度,優(yōu)先考慮hashmap
private static int findDuplicateNumber(int[] list) {
    int number = -1;
    //以數(shù)組的數(shù)作為key,如果key有重復(fù)诡曙,value遞增
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i=0; i<list.length; i++) {
        if (map.containsKey(list[i])) {
            map.put(list[i], map.get(list[i]) + 1);
        } else {
            map.put(list[i], 1);
        }
    }

    //便利hashmap臀叙,找出value大于1對應(yīng)的key值
    for (Map.Entry<Integer, Integer> entry: map.entrySet()) {
        if (entry.getValue() > 1) {
            number = entry.getKey();
        }
    }
    return number;
}
題目3:實(shí)現(xiàn)一個(gè)函數(shù),把字符串每中的每個(gè)空格替換成“%20”价卤。例如輸入“we are happy.”劝萤,則輸出“we%20are%20happy.”
public static void main (String[] args) {
    String str = "We are happy!";
    replaceBlank(str.toCharArray());
}

private static void replaceBlank(char[] arr) {
    int count = 0;
    int lenth = 0;
    //計(jì)算新數(shù)組長度,等于原長度加上空格數(shù)*2
    for (int i=0; i<arr.length; i++) {
        if (arr[i] == ' ') {
            count ++;
        }
    }
    lenth = arr.length + count * 2;

    //設(shè)置兩個(gè)指針p1,p2慎璧,如果p1遇到空格床嫌,p2 后三位賦值%20,p1后移一位
    char[] list = new char[lenth];
    int p1=0, p2=0; //p1原數(shù)組指針胸私,p2 新數(shù)組指針
    while (p1<arr.length && p2<lenth) {
        if (arr[p1] == ' ') {
            list[p2++] = '%';
            list[p2++] = '2';
            list[p2++] = '0';
            p1++;
        } else {
            list[p2++] = arr[p1++];
        }
    }
    System.out.print(String.valueOf(list));
}
題目4:有兩個(gè)排序的數(shù)組A1和A2厌处,內(nèi)存在A1的末尾有足夠多的空余空間容納A2.請實(shí)現(xiàn)一個(gè)函數(shù),把A2中的所有數(shù)字插入A1中岁疼,并且所有的數(shù)字是排序的阔涉。
public static void main(String[] args) {
    int[] A1 = {1, 3, 6, 7, 10, 23};
    int[] A2 = {2, 6, 8, 24};
    merged(A1, A2);
}

private static void merged(int[] A1, int[] A2) {
    int indexA1 = A1.length - 1;
    int indexA2 = A2.length - 1;
    int mergedIndex = A1.length + A2.length - 1;
    int[] mergedA = new int[A1.length + A2.length];
    //從后往前插入,也可以從前往后插入
    while (indexA1>=0 && indexA2>=0) {
        if (A1[indexA1] >= A2[indexA2]) {
            mergedA[mergedIndex--] = A1[indexA1--];
        } else {
            mergedA[mergedIndex--] = A2[indexA2--];
        }
    }

    while (indexA1>=0) {
        mergedA[mergedIndex--] = A1[indexA1--];
    }

    while (indexA2>=0) {
        mergedA[mergedIndex--] = A2[indexA2--];
    }

    for(int i=0; i<mergedA.length; i++) {
        System.out.print(mergedA[i] + ", ");
    }
}
題目5:輸入一個(gè)鏈表的頭結(jié)點(diǎn)五续,從尾到頭反過來打印每個(gè)節(jié)點(diǎn)的值
//鏈表節(jié)點(diǎn)定義
static class ListNode {
    int data;
    ListNode next;
}

public static void main(String[] args) {
    ListNode listNode = new ListNode();
    ListNode listNode2 = new ListNode();
    ListNode listNode3 = new ListNode();
    ListNode listNode4 = new ListNode();
    ListNode listNode5 = new ListNode();

    listNode.data = 1;
    listNode.next = listNode2;

    listNode2.data = 5;
    listNode2.next = listNode3;

    listNode3.data = 10;
    listNode3.next = listNode4;

    listNode4.data = 15;
    listNode4.next = listNode5;

    listNode5.data = 20;

    //打印鏈表
    printListNode(listNode);

    System.out.print("\n----------------------------\n");

    //使用堆反向打印鏈表
    printListReversByStack(listNode);

    System.out.print("\n----------------------------\n");

    //使用遞歸反向打印堆棧
    printListReversByRecursive(listNode);
}

//順序打印鏈表
private static void printListNode(ListNode node) {
    if (node == null) {
        return;
    }

    while (node != null) {
        System.out.print(node.data);
        node = node.next;
        if (node != null) {
            System.out.print(" --> ");
        }
    }
}

//使用堆反向打印鏈表
private static void printListReversByStack(ListNode node) {
    Stack<ListNode> stack = new Stack<ListNode>();

    while (node != null) {
        stack.push(node);
        node = node.next;
    }

    while (!stack.isEmpty()) {
        System.out.print(stack.pop().data);

        if (!stack.isEmpty()) {
            System.out.print(" --> ");
        }
    }
}

//使用遞歸反向打印堆棧
private static void printListReversByRecursive(ListNode node) {
    if (node != null) {
        if (node.next != null) {
            printListReversByRecursive(node.next);
        }
    }

    System.out.print(node.data);
}
題目5:重構(gòu)二叉樹
public static class BinaryTreeNode {
    int value;
    BinaryTreeNode left;
    BinaryTreeNode right;
}

public  static  void  main(String[] args) {
    int[] preOrder = {1,2,4,7,3,5,6,8};
    int[] inOrder={4,7,2,1,5,3,8,6};
    BinaryTreeNode node = reConstruct( preOrder, inOrder );
    printTree( node );
}

private static BinaryTreeNode reConstruct (int[] prOrder, int[] inOrder) {
    if (prOrder == null || inOrder == null || prOrder.length != inOrder.length || prOrder.length < 1) {
        return  null;
    }
    return constrct(prOrder, 0, prOrder.length-1, inOrder, 0, inOrder.length-1);
}

/*
*  @param preOrder 前序遍歷序列
*  @param preBegin 前序遍歷開始位置
*  @param preEnd 前序遍歷結(jié)束位置
*  @param inOrder 中序遍歷序列
*  @param inBegin 中序遍歷序列開始位置
*  @param inEnd 中序遍歷序列結(jié)束位置
* */
private static BinaryTreeNode constrct (int[] preOrder, int preBegin, int preEnd, int[] inOrder, int inBegin, int inEnd) {
    if (preBegin > preEnd) return  null;

    int root = preOrder[preBegin];
    int index = inBegin;

    while (index <= inEnd && inOrder[index] != root) {
        index ++;
    }

    if (index > inEnd) {
        throw new RuntimeException( "invalid input index: " + index);
    }

    BinaryTreeNode node = new BinaryTreeNode();
    node.value = root;
    node.left = constrct( preOrder, preBegin+1, preBegin+index-inBegin, inOrder, inBegin, index-1 );
    node.right =  constrct( preOrder, preBegin+index-inBegin+1, preEnd, inOrder, index+1, inEnd );
    return  node;
}

/*
* 中序遍歷遞歸打印
* */
private static void printTree (BinaryTreeNode node) {
    if (node != null) {
        printTree( node.left );
        System.out.print( node.value + " " );
        printTree( node.right );
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洒敏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疙驾,更是在濱河造成了極大的恐慌,老刑警劉巖郭毕,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件它碎,死亡現(xiàn)場離奇詭異,居然都是意外死亡显押,警方通過查閱死者的電腦和手機(jī)扳肛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乘碑,“玉大人挖息,你說我怎么就攤上這事∈薹簦” “怎么了套腹?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長资铡。 經(jīng)常有香客問我电禀,道長,這世上最難降的妖魔是什么笤休? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任尖飞,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘政基。我一直安慰自己贞铣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布沮明。 她就那樣靜靜地躺著辕坝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪珊擂。 梳的紋絲不亂的頭發(fā)上圣勒,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機(jī)與錄音摧扇,去河邊找鬼圣贸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扛稽,可吹牛的內(nèi)容都是我干的吁峻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼在张,長吁一口氣:“原來是場噩夢啊……” “哼用含!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起帮匾,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤啄骇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瘟斜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缸夹,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年螺句,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蟹倾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碾局。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笼蛛,死狀恐怖塘匣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情取劫,我是刑警寧澤匆笤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站勇凭,受9級特大地震影響疚膊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虾标,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一寓盗、第九天 我趴在偏房一處隱蔽的房頂上張望灌砖。 院中可真熱鬧,春花似錦傀蚌、人聲如沸基显。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撩幽。三九已至,卻和暖如春箩艺,著一層夾襖步出監(jiān)牢的瞬間窜醉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工艺谆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榨惰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓静汤,卻偏偏與公主長得像琅催,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子虫给,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容