字节跳动客户端开发提前批一面凉经(45min)
- 自我介绍
- 项目介绍
- http的状态码有哪些? 301 302 501 502 正常响应的http状态码 : 200(这部分没仔细看…)
- http和https的区别 回答了https加了SSL安全连接
- 手撕代码 两个链表 分别存放两个大数,头部放最高位,尾部放最低位,求这两个数的差 真不会…LeetCoe上也没找到
- ArrayList和LinkedList有什么不同?
- 进程、线程的区分
- TCP和UDP的区别
- 进程之间通信的方式
- CPU的调度策略?拉跨…
- 线程自己独有的资源?
- 线程之间的通信方式?
- 线程同步的方式有哪些?synchronized lock 信号量
- 说说乐观锁和悲观锁?
- 事务的特性?ACID
16。 volatile 关键字的作用,一个变量i被volatile修饰,两个线程想对这个变量进行 i++ 操作,能否保证结果正确,为什么。 - Java中的引用类型?new 一个对象属于什么引用?
- 软引用如何使用?拉跨…
- 反问1:面试表现如何?被拒绝回答了…
- 反问2:客户端开发岗的工作内容是什么?使用了哪些技术栈?
第五问,算法题:参考题目:两数之和 https://leetcode-cn.com/problems/add-two-numbers/
package LeetCode.字节跳动面试题.大数之差链表版;
import java.util.ArrayList;
/*
两个大数之差 链表版
两个链表 分别存放两个大数,头部放最高位,尾部放最低位,
求这两个数的差
*/
public class Solution {
public static void main(String[] args) {
int[] nums1 = {6,9};
int[] nums2 = {5,5,7};
int len_1 = nums1.length;
int len_2 = nums2.length;
ListNode head1 = addListNode(nums1);
ListNode head2 = addListNode(nums2);
if (len_1 > len_2) { // 大数减小数
System.out.println(listToArrayList(head1));
System.out.print("- ");
System.out.println(listToArrayList(head2));
System.out.println(listToArrayList(minusInList(head1, head2)));
}else { // 小数减大数
System.out.println(listToArrayList(head1));
System.out.print("- ");
System.out.println(listToArrayList(head2));
System.out.println("- " + listToArrayList(minusInList(head2, head1)));
}
}
public static ListNode minusInList(ListNode head1, ListNode head2) {
ListNode ans = new ListNode(-1);
ListNode p = ans; // ans 是头节点
int pre = 0; // 表示借位
// 反转链表 从尾部往前计算每一位的差值
head1 = reverse(head1);
head2 = reverse(head2);
while (head1 != null && head2 != null) {
int differ = head1.val - head2.val + pre;
pre = differ < 0 ? -1 : 0;
if (differ<0) {
differ = (differ + 10) % 10;
}
p.next = new ListNode(differ);
p = p.next;
head1 = head1.next;
head2 = head2.next;
}
while (head1 != null) {
int differ = head1.val+ pre;
pre = differ < 0 ? -1 : 0;
if (differ<0) {
differ = (differ + 10) % 10;
}
p.next = new ListNode(differ);
p = p.next;
head1 = head1.next;
}
while (head2 != null) {
int differ = head2.val + pre;
pre = differ < 0 ? -1 : 0;
if (differ<0) {
differ = (differ + 10) % 10;
}
p.next = new ListNode(differ);
p = p.next;
head2 = head2.next;
}
// 反转链表
return reverse(ans.next);
}
public static ListNode reverse(ListNode head) { // 实现反转链表
ListNode pre = null;
while (head != null) {
ListNode next = head.next;
head.next = pre;
pre = head; // 这里容易写错!
head = next;
}
return pre;
}
public static ArrayList<Integer> listToArrayList(ListNode head) { // 将链表转化为数组
ArrayList<Integer> list = new ArrayList<Integer>();
if (head == null) {
return list;
}
while (head != null) {
list.add(head.val);
head = head.next;
}
return list;
}
public static ListNode addListNode(int[] nums) { // 根据数组来建立链表
ListNode head = new ListNode(-1);
ListNode temp = null;
temp = head;
for (int i = 0; i < nums.length; i++) {
temp.next = new ListNode(nums[i]);
temp = temp.next;
/* System.out.print("nums[" + i + "]: "+nums[i] + " temp.val : ");
System.out.println(temp.val);*/
}
return head.next; // 返回该链表的头节点
}
}
class ListNode {
int val;
ListNode next = null;
public ListNode(int val) {
this.val = val;
}
}
1502

被折叠的 条评论
为什么被折叠?



