【經典】華爲遠程機試題分享(跟進)

在上一篇博客中有說到面試的具體事兒

昨晚那種方法做出來之後,感覺可讀性不好,也就是一般情況下很難看懂代碼,所以接近睡着時我又想到一個辦法比較簡單,而且易懂,所以寫這篇博客和大家分享一下吧(具體就圍繞下圖這個核心問題來做

其實我的想法很簡單,就是藉助鏈表來實現,因爲鏈表刪除功能方便,直接pollFirst() pollLast();

1、先取出來最上面一排,並移除;

2、取出最又一排並移除;

3、倒敘取出最下面一排並移除;

4、倒敘取出最左面一排並移除;

每次取出來後就刪除,當刪除一圈後又是一個新的二維;然後直接遞歸就完事兒了!

(下面粘貼代碼)

public static void main(String[] args) {
        
        // 這裏模擬一個二維數組
        // ** 這裏用鏈表來存 
        LinkedList<LinkedList<Integer>> linkedLists = new LinkedList<>();
        LinkedList<Integer> linkedList = null;
        Integer[][] array = {{1,2,3,4,5,6,7},{8,9,10,11,12,13,14},{15,16,17,18,19,20,21},{22,23,24,25,26,27,28},{29,30,31,32,33,34,35}};
        for (int i = 0; i < array.length; i++) {
            linkedList = new LinkedList<>();
            for (Integer value : array[i]) {
                linkedList.add(value);
            }
            linkedLists.add(linkedList);
        }

        // 打印原來的數據
        System.out.println("打印提供的原數據:" + linkedLists.toString());

        LinkedList resList = new LinkedList<Integer>();
        printByCycle(linkedLists, resList);
        
        // 打印順時針獲取的數據
        System.out.println("順時針打印原數據:" + resList);

    }
private static <T> void  printByCycle(LinkedList<LinkedList<T>> sourceList, List<T> targetList){
        // 從左到右  橫向
        LinkedList<T> rmRow = sourceList.pollFirst();
        targetList.addAll(rmRow);
        //從上到下  豎向
        sourceList.forEach((e)->{
            targetList.add(e.pollLast());
            if(e.size()==0){
                sourceList.pollFirst();
            }
        });
        //從右到左  橫向
        LinkedList<T> lastLinked = sourceList.pollLast();
        while (lastLinked!=null && lastLinked.size()>0){
            targetList.add(lastLinked.pollLast());
        }
        //從下到上 豎向
        for (int i = sourceList.size() - 1 ; i >=0 ; i--) {
            LinkedList<T> e = sourceList.get(i);
            targetList.add(e.pollFirst());
            if(e.size()==0){
                sourceList.pollLast();
            }
        }
        //遞歸
        if(sourceList.size()>0){
            printByCycle(sourceList, targetList);
        }
    }

 

  最後結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章