ARTS
- 每週至少做一個leetcode 的算法題,(Algorithm)
- 閱讀並點評至少一篇英文技術文章,(Review)
- 學習至少一個技術技巧,(Technique)
- 至少分享一篇有觀點和思考的技術文章。(Share)
Algorithm
637. Average of Levels in Binary Tree
- 分析:定義一個map,層數作爲key,value保存每層的元素個數和所有元素的和,遍歷這個樹,把map裏面填值,遍歷結束後,再遍歷這個map,把每層的平均數放到數組裏,最後數組轉爲list返回,不用考慮list裏的排序了.
下面給出java實現
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
Map<Integer, TreeLevel> store = new HashMap<>();
init(root, store, 1);
Double[] arr = new Double[store.size()];
for (Map.Entry<Integer, TreeLevel> entry : store.entrySet()) {
arr[entry.getKey() - 1] = entry.getValue().getAverage();
}
return Arrays.asList(arr);
}
void init(TreeNode root, Map<Integer, TreeLevel> store, int level) {
if (root == null) return;
TreeLevel treeLevel = store.get(level);
if (treeLevel == null) {
treeLevel = new TreeLevel();
store.put(level, treeLevel);
}
treeLevel.count++;
treeLevel.sum+=root.val;
init(root.left, store, level+1);
init(root.right, store, level+1);
}
// 定義一個類存儲每一層的信息
class TreeLevel {
int count; // 該層有多少元素
double sum; // 該層所有元素的和,這個要用double類型來保存,eg:[2147483647,2147483647,2147483647]
// 返回該層的平均數
Double getAverage() {
return sum / count;
}
}
}
Review
【Kaggle與開源數據集】Open Source Datasets with Kaggle
本文來自於斯坦福大學的一名軟件工程師。
文章開篇作者給出了一般情況下數據集在被採用的整個過程(“sharing operation” )
作者指出了其中存在的些許問題並提出她在本篇文章中雖然沒有成熟的生產解決方案可以分享,但是會展示出入以kaggle數據集的形式來共享數據,在文章後面他逐步優化了上面的步驟並提出了自己的思路。
其實本文更像是一個廣告,他在本文後面着重宣傳了一下他們(實驗室)需要的工程師和協作平臺的各種需求。
關鍵詞:kaggle 數據共享
Technique
下面分享一道鏈表操作題
- 題目描述:
A和B是兩個單鏈表(帶表頭結點),其中元素遞增有序。設計一個算法,將A和B歸併成一個按元素值非遞減有序的鏈表C,C由A和B中的結點組成。
- 題目分析:
已知A和B中的元素遞增有序,要使歸併後的C中的元素依然有序,可以從A、B中的所有蒜素都插入到C中時,C一定是有遞增有序的。* 很明顯 ,由於A、B是遞增的,因此A中的最小元素是其開始結點中的元素,B也一樣。只需從A、B的開始結點中選出一個較小的來插入C的尾部即可。* 這裏還需注意,A和B中的元素有可能一個已經全部被插入到C中,另一個還沒有插完,如A中所有元素已經全部被插入到C中,而B還沒有插完,這說明B中的所有元素都大於C中的元素,因此只要將將B鏈接到C的尾部即可。如果A沒有插完,則用類似的方法來解決。
- 代碼實現:
#include<iostream>
#define N 50
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
} LNode;
void merge(LNode * A, LNode *B, LNode *&C )
{
LNode * p = A->next;
LNode *q = B->next;
LNode *r;
C = A;
C->next = NULL;
free(B);
r = C;
while (p != NULL && q != NULL)
{
if (p->data <= q->data)
{
r = r->next;
}
else
{
r->next = q;
q = q->next;
r = r->next;
}
}
r->next = NULL;
if (p != NULL) r->next = p;
if (q != NULL) r->next = q;
}
- 總結:
本題主要涵蓋了兩個知識點:一個是尾插法簡歷單鏈表;另一個是單鏈表的歸併操作。
Share
最近在用sublime發現了一個不錯的簡書作者,裏面關於它有很多插件的介紹,在這裏分享給大家。