objetivo
- Coleção especial de alguns tópicos interessantes
- Essas perguntas serão fáceis de ler e erradas
- Atualizar continuamente, a cada dez perguntas como um artigo
índice
- 1. Pensamento XOR
- 2. Relacionado a matriz
- 3. Cruzando a ponte
- 4. Pergunta aleatória 1
- 5. Pergunta aleatória 2
- 6. Problemas de pesagem
- 7. Problema de remédio bebendo em ratos
Série de artigos
- Interview Companion Part 1: Humble Java Basics / Trap Questions, você pode ler imediatamente e errar
- Entrevista Companheiro - Parte 3: Erros em métodos comuns
1. Pensamento XOR
1.1. Em uma matriz emparelhada (ou seja, cada número na matriz deve ter outro número igual ao seu valor), um número é inserido pelo programador por engano (ou seja, o número é único nesta matriz), como encontrar Fora deste número?
答案:将所有数化为二进制,做异或
。
1.2. Em um par de matrizes (ou seja, cada número na matriz deve ter outro número igual ao seu valor), o programador inseriu por engano dois números (ou seja, ambos os números estão nesta matriz Único), como encontrar esses dois números?
答案:异或所有数,所得结果相当于混入的这两个数的异或,取其不为0的某一位,按照这一位将数组元素分成两组(一组为0,一组为1),两组组内异或,分别得到这两个数。
1.3. Determinar se um número é ímpar?
Resposta: Até agora, as duas formas mais concisas são as seguintes:
方式一:
public static boolean isOdd(int i) {
return i >> 1 << 1 != i;
}
方式二:
public static boolean isOdd(int i) {
return (i & 1) == 1;
}
Blog de referência:
A implementação subjacente dessas classes jdk usou operações de bit
Dois, relacionado à matriz
2.1. Dado um array a [], percorra-o uma vez para encontrar o maior (menor) elemento.
答案:冒泡排序。
2.2. Dado um array a [], descubra que a soma de certos dois números é igual a um dado número M.
答案:首先快排(从小到大),然后头尾两个指针,若头尾指向的数之和大于M,尾指针减减,否则头指针加加。
2.3. Dado um array a [], encontre k números nele (k> = 2) de forma que a soma seja igual a um dado número M, sem retornar falso.
-
答案:动态规划的思想。
Terceiro, o problema da ponte
3.1. O problema de quatro pessoas cruzando a ponte: a velocidade é definida para v1, v2, v3, v4, encontrando v1> v2> v3> v4, e o tempo de cruzar o rio sozinho encontra-se: t1 <t2 <t3 <t4, está chovendo neste momento, quatro pessoas Há apenas um guarda-chuva, então as duas pessoas compartilham um guarda-chuva para atravessar o rio. A velocidade de travessia mais lenta é a principal. Depois de cruzar o rio, uma delas precisa enviar o guarda-chuva de volta. Pergunte como organizar o menor tempo de travessia
responda:
方案一:正常思维会认为v1速度最快,让他每次回头送伞最合适,于是v1分别与其他人过河再回头送伞,总时间:t2+t3+t4+2*t1。
方案二:考虑到v1>v2>>>v3>v4(即v1、v2远远大于v3、v4),可以让v1、v2先过河,v1回头送伞,v3、v4一起过河,v2回头送伞,然后v1、v2再过河, 总时间:t2+t1+t4+t2+t2。综合考虑,本题回答动态规划为最佳答案。
Quatro perguntas aleatórias
4.1. Há uma função A () que pode gerar números aleatórios de 0 a 9, e cada número aleatório é gerado com a mesma probabilidade. Agora você precisa escrever uma função B () para que a probabilidade de gerar os números 1, 2, 3 seja 0,2 e o número 4 A probabilidade é de 0,4.
Resposta:
public int B() {
Switch(A()){
Case 0, 6, 7, 8, 9:B();
Case 1, 2, 3:Print(1or 2or 3); break;
Case 4, 5:Print(4);break;
}
}
或者
public int B() {
Switch(A()){
Case 0,1:Print(1);break;
Case 2,3:Print(2);break;
Case 4,5:Print(3);break;
Case 6,7,8,9:Print(4);break;
}
}
4.2. Há uma função A () que pode gerar números aleatórios de 0 a 3, e cada número aleatório é gerado com a mesma probabilidade. Agora você precisa escrever uma função B () para que a probabilidade de gerar os números 1, 2, 3 seja 0,2 e o número 4 A probabilidade é de 0,4.
Resposta:
public int B() {
Switch((A(),A())){
Case (0,0):Print(1);break;
Case (0,1):Print(2);break;
Case (0,2):Print(3);break;
Case (0,3),(1,0):Print(4);break;
case other:B();break;
}
}
Cinco, pesando problemas
5.1. Quatro caixas de grãos de chocolate com exatamente a mesma aparência são chamadas de A, B, C e D. Uma caixa de grãos de chocolate é um grama mais pesada do que as outras caixas. Como encontrar esta caixa de grãos de chocolate pesando-os de uma vez.
Resposta:
方法一:如果是显示重量的秤,则从第一盒取1个,第二盒取2个,第三盒取3个,第四盒取4个,重量比正常重几克就是第几盒。
方法二:不显示重量的秤,每边放两盒,则能知道那边重,再分别取走一盒,看余下的是否平衡。
Seis, o problema de ratos bebendo remédio
6.1. Existem 1000 frascos de poção e há apenas um frasco de veneno dentro. Depois que o rato beber o veneno, ele morrerá em apenas uma hora. Agora vou dar a você 10 ratos e 1 hora. Descubra este frasco de veneno (presumindo que a quantidade de veneno seja muito alta. Grande, pode ser dividido em várias partes e não afeta a toxicidade).
因为只有一瓶药水,所以相对简单,首先对所有的药水编号1-1000,对老鼠编号1-10。
十个老鼠前面放十个容器,盛药水,编号为x的药水,一定有一个二进制数(比如23号药水对应二进制:10111),因此把23号药水分别滴入第1号、第2号、第3号、第5号的老鼠容器内.
做完前两步,分别让老鼠喝下去,1小时后,假设第x,y,z,k号小鼠死亡,那么毒药就是二进制为kzyx的那瓶,比如第2号、第3号、第5号、第7号老鼠死亡,对应的二进制为0001010110,因此第86号药水是毒药。
6.2. Existem 1000 frascos de poção e há apenas um frasco de veneno. Depois que o rato bebe o veneno, ele morre em apenas uma hora. Agora você recebe 2 ratos e algumas horas. Descubra este frasco de veneno (presumindo que a quantidade de veneno seja muito alta. Grande, pode ser dividido em várias partes e não afeta a toxicidade).
本题区别于上题是,只有两只小鼠,因此不能采用二进制了,换个思维,采用二维矩阵,我们把1000瓶药,放置成31*31=961、6*6=36、3,这样的三堆,前两个分别是两个矩阵。
我们知道小鼠喝了毒药的情况下,在一小时的时候,也就是3600秒的时候,会死亡,那么我们根据不同的时间差,第一个小鼠在不同的时间喝矩阵的行混合物,第二只在不同时间段喝列的混合物。
假设第一只在第一小时零15秒的时候死亡,说明第一个矩阵的第15行内有毒药,第二只在1小时30秒的时候死亡,说明第一个矩阵的第30列有毒药,那么第一个矩阵的(15,30)号药水是毒药,因为只有一瓶毒药,不存在跨矩阵的情况。
6.3. Existem 1.000 frascos de poção, mas não sei quantos frascos de veneno existem. Ratos morrerão em apenas uma hora após beber o veneno. Como testar quantos venenos existem em menos horas e em menos ratos?
- Esta pergunta é diferente da pergunta anterior porque o número de venenos é desconhecido. Se uma matriz bidimensional for usada, o comprimento é x ratos, a largura é y ratos e cada rato bebe a mistura de poção na coluna ou linha atual, então x + y ratos Você pode testar x * y frascos de remédio?
假设存在一瓶毒药,坐标为(x3,y5),那么一小时后,编号为x3和y5的老鼠会死亡
- Isso significa que, se houver k frascos de veneno, podemos determinar quantos frascos de veneno existem determinando as coordenadas com base nos ratos mortos?
然鹅并不是,假设存在这样一种情况,我们把k瓶毒药放置在矩阵所有的对角线上,一小时后,所有的小鼠全部死亡,能推断出来该矩阵全部有毒?
- Como pode ser eficaz?
因为这道题是不知道多少瓶毒药,因此,存在一种可能性,有1000瓶毒药,那么最大需要1000只老鼠来测试,所以矩阵法失效,时间法也失效。
目前一种比较实际的方法,但不一定是最好的方法是:1000瓶毒药放置成100*10的矩阵,用10只老鼠,按顺序每隔1秒喝当前列的100瓶药水中的一瓶,那么小鼠在某时间死亡,其后的药水需要重新进行测试。比如:100行*10列的药水,每一列编号1-100,第一只小鼠在第一秒喝第一瓶,第二秒喝第二瓶,假设一号小鼠在1小时56秒死亡,那么可以判定第一列的1-55瓶药水安全,56-100需要重新验证。