華為2012實驗室中央軟件研究院 軟件開發工程師技術面面經
寫在前面:
感覺今年華為招人還是挺多的,至少在招人方面,絲毫沒有看出美國制裁的影響,業務似乎並沒有縮減,招人的需求還是很大, 身邊的朋友們幾乎人手一個華為offer,我也僥幸拿了一個,
我是今年5月初投遞華為的實習offer的,5月底拿到了華為的實習offer,但是那時候我已經在海康大數據算法崗入職了,由於這邊領導對我也超級好,雖然華為薪資可能高很多,但是卻沒有辭職跳槽。實習無非幾個月,秋招再見呀。
技術面首先上來手撕了一道算法題,以前在力扣上好像做過這道題,但是時間久了,我忘記了,第一種非遞歸寫法是我當時的解答,不過面試官說我雖然做出了這道題,但是避開了他想考察的知識點,我后來想了很久,覺得他可能是要考察我遞歸的思想,於是就有了這第二種解法,都一並放在這里,
后來就問了一些簡歷中的問題,問了一些java虛擬機的問題,具體不是很記得了,總體來說,整個面試過程中,氛圍很愉快,華為人知道怎么去引導節奏,當我對某個問題表示疑問,其實我是沒聽清楚,然后他就說,那沒關系,我們繼續下一個問題,真的很輕松,很舒服,還有那個聯系我的HR人也超級好,感覺我最后沒去華為有點對不住他們。 在這里給華為打call,小伙伴們趕緊投。
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
java 的非遞歸實現:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode prev = head;
int carry = 0;
while (l1 != null || l2 != null || carry != 0) {
int sum = (l1 != null ? l1.val : 0) + (l2 != null ? l2.val : 0) + carry;//求兩個節點相加的值
carry = sum / 10;//取進位的值
prev.next = new ListNode(sum % 10);//sum對10求余后放到節點中
prev = prev.next;
l1 = l1 != null ? l1.next : l1;
l2 = l2 != null ? l2.next : l2;
}
return head.next;
}
Java的遞歸實現
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
helper(head, l1, l2, 0);
return head.next;
}
private void helper(ListNode result, ListNode l1, ListNode l2, int carry) {
if (l1 == null && l2 == null && carry == 0)
return;
int sum = (l1 != null ? l1.val : 0) + (l2 != null ? l2.val : 0) + carry;
result.next = new ListNode(0);
result.next.val = sum % 10;
carry = sum / 10;
helper(result.next, l1 != null ? l1.next : null, l2 != null ? l2.next : null, carry);
}