整理了几道字节跳动真题,来试试自己水平有多厉害吧,每题还有答案和详细解答哦。
1、变量a是一个64位有符号的整数,初始值用16进制表示为:0x7FFFFFFFFFFFFFFF。变量b是一个64位有符号的整数,初始值用16进制表示为:0x8000000000000000。则a+b的结果用10进制表示为多少?
A:1
B:-1
C:263+262+…+22+21+2^0
D:–(263+262+…+22+21+2^0)
(1)a+b的16进制表示为:0xFFFFFFFFFFFFFFF(16位F),转为2进制为1111111111111111。
(2)有符号整数是针对2进制而言的,最高位代表符号位,其中“0”代表“+”,“1”代表“-”。所以a+b的结果是一个负数。
(3)计算机中的负数是以补码的形式保存的,将补码转换成原码方式为:除符号位之外,按位取反,末尾+1,所以a+b=-1。
答案:B
2、在TCP建立三次握手过程中,关于第二次握手发送的标记,最正确的描述是?
A:ACK B:SYN,ACK C:SYN,PSH D:SYN
答案:B。附上TCP建立连接的三次握手过程图。
3、栈是先进后出的数据结构。给定一个大小为3的初始状态为空的栈,已知一组数据经过这个栈后,最终得到的数据顺序依次为:1324,问原始进栈的数据不可能是以下的哪组?
A:2314
B:1423
C:4231
D:3124
答案:C。本题考栈的进出规则,注意题中规定栈的初始大小为3。
4、假如操作系统中使用LRU内存淘汰策略:如果内存需要加载新数据但空间又不足,则会按照最近访问时间进行排序,并将最老的数据淘汰,假设现在内存空间大小为5,原本内存中没有数据,对内存中数据的访问顺序如下:1,2,5,3,4,6,1,4,3,6,7,8,3,9。则:
A:缺页次数:9
B:缺页次数:4
C:缺页次数:10
D:缺页次数:5
答案:C。原本内存中没有数据,直到读满数据,每一次读取数据都是缺页,共5次。
第一次读满数据的顺序为:1,2,5,3,4。
读取6为新数据,淘汰1数据序列为2,5,3,4,6————第6次缺页
读取1为新数据,淘汰2数据序列为5,3,4,6,1————第7次缺页
读取4为已有数据,注意更新数据序列为5,3,6,1,4
读取3为已有数据,注意更新数据序列为5,6,1,4,3
读取6为已有数据,注意更新数据序列为5,1,4,3,6
读取7为新数据,淘汰5数据序列为1,4,3,6,7————第8次缺页
读取8为新数据,淘汰1数据序列为4,3,6,7,8————第9次缺页
读取3为已有数据,注意更新数据序列为4,6,7,8,3
读取9为新数据,淘汰4数据序列为6,7,8,3,9————第10次缺页
5、有三个程序J1,J2,J3。程序在单核CPU执行时,三个程序需要的资源如下所示:(优先级高的程序可以抢占优先级低的程序的CPU,但不能抢占IO。问当所有任务执行完毕时,共消耗的时间是?)
程序 | CPU占用时间(ms) | IO占用时间(ms) | 执行顺序 | 优先级 |
---|---|---|---|---|
J1 | 40 | 60 | 先CPU后IO | 高 |
J2 | 20 | 50 | 先IO后CPU | 中 |
J3 | 30 | 20 | 先CPU后IO | 低 |
A:170ms B:160ms C:120ms D:130ms
答案:D。
6、给定整数m,n以及数列A1,A2,…An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大于m的有多少个?
import java.io.*;public class Main {static class TrieNode {long count=1;TrieNode[] next = new TrieNode[2];}private static int read(StreamTokenizer st) throws IOException {st.nextToken();return (int) st.nval;}public static void main(String[] args) throws IOException {StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));//读取n,mint n = read(st);int m = read(st);//读取数组int[] arr = new int[n];for(int i=0; i<n; i++){arr[i] = read(st);}//构建字典树TrieNode root = build(arr);//统计(查询字典树)long total=0;for(int i=0; i<arr.length; i++){total += query(root, arr[i], 16, m);}System.out.println(total/2);}private static long query(TrieNode node, int a, int idx, int m){if(node==null)return 0;TrieNode cur = node;for(int i=idx; i>=0; i--){int aDigit = (a>>i)&1;int mDigit = (m>>i)&1;if(aDigit==1 && mDigit==1){if(cur.next[0]==null)return 0;cur = cur.next[0];}else if(aDigit==0 && mDigit==1){if(cur.next[1]==null)return 0;cur = cur.next[1];}else if(aDigit==1 && mDigit==0){long p = cur.next[0]==null? 0 : cur.next[0].count;long q = query(cur.next[1], a, i-1, m);return p+q;}else if(aDigit==0 && mDigit==0){long p = cur.next[1]==null? 0 : cur.next[1].count;long q = query(cur.next[0], a, i-1, m);return p+q;}}return 0;}private static TrieNode build(int[] arr){TrieNode root = new TrieNode();for(int i=0; i<arr.length; i++){TrieNode cur = root;//从高位插入字典树for(int idx=16; idx>=0; idx--){int digit = (arr[i]>>idx)&1;if(cur.next[digit]==null){cur.next[digit] = new TrieNode();}else{cur.next[digit].count++;}cur = cur.next[digit];}}return root;}
}
7、给定一个m * n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
示例:输入[[1,2,3],[4,5,6],[7,8,9]] 返回值[1,2,3,6,9,8,7,4,5]
import java.util.*;
public class Solution {public ArrayList<Integer> spiralOrder(int[][] matrix) {ArrayList<Integer> res = new ArrayList<>();if(matrix.length == 0)return res;int top = 0, bottom = matrix.length-1;int left = 0, right = matrix[0].length-1;while( top < (matrix.length+1)/2 && left < (matrix[0].length+1)/2 ){//上面 左到右for(int i = left; i <= right; i++){res.add(matrix[top][i]);}//右边 上到下for(int i = top+1; i <= bottom; i++){res.add(matrix[i][right]);}//下面 右到左for(int i = right-1; top!=bottom && i>=left; i--){res.add(matrix[bottom][i]);}//左边 下到上for(int i = bottom-1; left!=right && i>=top+1; i--){res.add(matrix[i][left]);}++top;--bottom;++left;--right;}return res;}
}
8、给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,求所有的路径中最小的路径和。
示例:输入[[1,3,5,9],[8,1,3,4],[5,0,6,1],[8,8,4,0]] 返回值12
import java.util.*;
public class Solution {/*** * @param matrix int整型二维数组 the matrix* @return int整型*/public int minPathSum (int[][] matrix) {// write code hereint n = matrix.length;int m = matrix[0].length;int[][] dp = new int[n][m];dp[0][0] = matrix[0][0];for(int i=1;i<m;i++)dp[0][i] = dp[0][i-1] + matrix[0][i];for(int i=1;i<n;i++)dp[i][0] = dp[i-1][0] + matrix[i][0];for(int i=1;i<n;i++)for(int j=1;j<m;j++)dp[i][j] = Math.min(dp[i][j-1],dp[i-1][j]) + matrix[i][j];return dp[n-1][m-1];}
}
9、给定一个十进制数M以及需要转换的进制数N。将十进制数M转化为N进制数。
import java.util.*;
public class Solution {/*** 进制转换* @param M int整型 给定整数* @param N int整型 转换到的进制* @return string字符串*/public String solve (int M, int N) {// write code hereif(M==0){return "0";}int sign = 1;if(M<0){sign = -1;M=-M;}StringBuilder sb = new StringBuilder();while(M>0){int k = M%N;if(k>=10){sb.append((char)(k-10+'A'));}else{sb.append(k);}M=M/N;}if(sign==-1){sb.append('-');}return sb.reverse().toString();//将字符串反过来,然后加上负号}
}
10、把只包含质因子2、3和5的数称作丑数。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
public class Solution {public int GetUglyNumber_Solution(int index) {if(index <= 0)return 0;int p2=0,p3=0,p5=0;int[] result = new int[index];result[0] = 1;//for(int i=1; i < index; i++){ result[i] = Math.min(result[p2]*2, Math.min(result[p3]*3, result[p5]*5));if(result[i] == result[p2]*2)p2++;if(result[i] == result[p3]*3)p3++;if(result[i] == result[p5]*5)p5++;}return result[index-1];}
}
上面的笔试题你做对了几道?如果你觉得看得不过瘾,关注我,后续会给同学们分享更多大厂笔试真题。
xDroid——让安卓应用运行在Linux平台上