Executando verificação de segurança...
2

Aconteceu o que eu mais temia

Semana passada, passei pelo meu primeiro live coding. Não avancei nem do primeiro problema, um ridiculamente simples: dada uma string, dizer se ela possui caracteres únicos ou não.

Na minha cabeça, a lógica era clara: criar uma lista com cada caractere, ordená-la, percorrê-la para localizar elementos iguais e retornar true ou false. Talvez não fosse a maneira mais eficiente, mas pensei dessa forma.

Contudo, na hora de transformar isso em código, não soube o que escrever. Mesmo com as dicas de quem estava me avaliando (que, por sinal, eram muito gente boa), não saí do lugar. Escrevi um for, printei a minha lista, mas o tempo acabou e não concluí nada.

Nem parecia que eu tinha cursado as disciplinas de Algoritmos e Estrutura de Dados, ou mesmo Programação 1. Senti-me patético, como um impostor tentando enganar alguém.

Ontem mesmo, comecei a resolver alguns problemas no Beecrowd (antigo URI); consegui fazer cerca de 30 exercícios de iniciante tranquilamente. Mas, quando passei para o LeetCode, travei ainda mais. Até a questão mais simples lá parece extremamente complexa.

Vou pausar minhas candidaturas ao menos por este mês; o que aconteceu não pode se repetir.

Carregando publicação patrocinada...
4

Eu acho isso super normal, live coding nada mais é que prática. Hoje em dia ninguém mais escreve código puro (IA faz tudo), então fica mais difícil ter segurança na hora do live coding. Eu, mesmo tendo vários anos de experiencia, na hora do live coding esqueço como se escreve um for ou while kkkk Então o importante é não desanimar, continuar praticando e continuar tentando (aliás, sim isso que aconteceu vai se repetir, e está tudo bem).

2

Tipo isso?

bool has_unique_chars(const char *str)
{
	char table[127] = {};

	for (int i = 0; str[i]; i++)
	    table[str[i]]++;

	for (int i = 32; i < 127; i++)
	    if (table[i] == 1)
		    return true;

	return false;
}
1

Opa, quase isso, mas creio que dessa forma só vai verificar um caracter apenas, e não a string inteira, vou colocar aqui a questão completa que me foi passada:
"Implementar um algoritmo para determinar se uma string possui apenas caracteres únicos. Pode-se usar estruturas auxiliares simples. Detalhe: considere apenas strings com caracteres ascii. Ex: ”java” -> false “ABC” -> true"

1

Melhor ainda

bool str_has_only_unique_chars(const char *str)
{
    char table[127] = {};

    for (int i = 0; str[i]; i++)
        if (table[str[i]])
            return false;
        else
            table[str[i]]++;

    return true;
}

2

Realmente no trabalho faço coisas mais complexas que envolvem o próprio negócio e suas particularidades e quase sempre usamos o auto complete para trechos assim, só revisamos é claro. Mas eu tentaria converter a string em um array, depois percorrer esse array com um for manual.

i = 0; i < string.length; i++ 

dentro do for faria um if pegando o indexOf do i e válido se é diferente do i atual

 if (string.indexOf(string[i]) !== i) {
    return false;
  }
[...]
  return true;

Como o indexOf vai retornar o primeiro elemento, ao procurar a string "aabc" a primeira vez seria index 0 !== 0 (não, tudo ok), na segunda iteração, index 0 !== 1 (sim, pegou index 0 novamente porque o "a" apareceu já no index 0)

Ao pesquisar sobre vi que da para fazer melhor ainda usando o Set, se não precisar remover acentos, maiúsculas, espaços em brancos e outras coisas, poderia só fazer um new Set da string, que já vai salvar cada caracter único como uma chave desse Set e validar se tem o mesmo tamanho da string original.

function temCaracteresUnicos(str) {
  return new Set(str).size === str.length;
}