Eliminar todas as linhas! Quem era o último sobrevivente?
O significado de problemas como segue:
Dada uma lista de números inteiros de 1 a n encomendados.
Em primeiro lugar, da esquerda para a direita, começando com o primeiro dígito, excluir todos os outros dígitos, até o final da lista.
O segundo passo, os restantes números, da direita para a esquerda, começando com o dígito penúltimo, cada dígito para eliminar, até o início da lista.
Nós repetimos estas duas etapas, da esquerda para a direita e da direita para a esquerda, alternadamente, até que apenas um número.
Retorna uma lista de comprimento n, os últimos números restantes.
Exemplo:
Entrada:
. N- = 9,
1 2 3 4 5 6 7 8 9
2 4 6 8
26
6
de saída:
6
Em primeiro lugar, observar e analisar a amostra de
Kankan que está leis não fez
O primeiro 13579 intervalo número 2 é suprimido o primeiro
48 segundo intervalo do primeiro número não é excluído 4
2 terceiro intervalo é eliminado primeiro número 8
...
- N-th sub-intervalo de 2 ^ n
- Da direita para a esquerda para excluirO tempo
quando o número restante denúmero ímparO primeiro número será eliminado
quando o número restante demesmo O primeiro número não serão excluídos - Cada terminar de remover
o número restantepermanecer / = 2
projeto de algoritmos:
O primeiro número de res marcar o início
passo de marcação cada passo
left2right representado direção de passagem
Da esquerda para a direita,
o primeiro número será eliminado - atualizações RES
de direita para a esquerda
quando o número restante denúmero ímparO primeiro número será eliminado - RES atualizados
quando o número restante demesmoO primeiro número não serão excluídos - RES permanece inalterado
Cada travessia primário PASSO 2 =
left2right negada
Código é a seguinte :
class Solution {
public:
int lastRemaining(int n) {
bool left2right = true;
int res = 1, step = 1, remain = n;
while (remain > 1) {
if (left2right || remain % 2 == 1) res += step;
remain /= 2;
step *= 2;
left2right = !left2right;
}
return res;
}
};