[RESOSLVIDO]Dúvida - Ajuda - Java Básico - Repetição

Primeiramente, boa tarde a todos.

Estou fazendo um exercício e estou com alguns problemas de lógica. Quem puder me ajudar, ascendendo uma luz, ajuda, vamos ao código.

Dada a String asd12345, eu preciso analisar da Direita pra Esquerda quantas vezes o número 0 e o número 1 apareceu e fazer o seguinte calculo.

1 - apareceu uma vez 1 = (11 = 1)

Se a sequencia fosse assim asd012 o resultado deve ser assim.

0 * 1 = 0
1 * 1 = 1

Vamos ao código.

/**
* Entrada das Informações.
*/

	String sequencia = JOptionPane.showInputDialog("Sequencia de Caracteres: ");

/**
* Invertendo a Sequencia.
* Essa parte só entrou pra eu ver o resultado impresso.
*/

	for(int i = sequencia.length() - 1; i >= 0; i--) {
		
		sequenciaInversa += sequencia.charAt(i);
	}

/**
* Processamento das Informações.
*/

	for(int i = sequenciaInversa.length() - 1; i >= 0; i--) {
		
		if(sequenciaInversa.charAt(i) == '0') {
			
			achei++;				
			valor = sequenciaInversa.indexOf(sequenciaInversa);
			posicao = i;
			System.out.println("Processamento: " + valor + "*" + achei);
			resultado = valor * achei;
			
		} else if(sequenciaInversa.charAt(i) == '1') {
			
			achei++;
			valor = sequenciaInversa.indexOf(sequenciaInversa);
			posicao = i;
			System.out.println("Processamento: " + valor + "*" + achei);
			resultado = valor * achei;
			
		}
	}

Aqui no processamento que complica.

  • O que eu entendo que fiz.
    – Se o valor for igual a 0 eu adiciono 1 ao contador achei, usando o indexOf eu pego esse valor e guardo e também guardo a posição dele, aí eu multiplico o valor * contador.

Só que quando entra no ELSE, o valor continua o mesmo, ou seja, 0.

O que eu preciso.

Eu quero que me ajudem a pensar para que eu possa percorrer a String e sempre que achar algo que eu quero, eu guardo o valor e a posição.

Resultado final para a String 1230123

1 * 1 = Numero 1 * A quantidade que achou. +
0 * 1 = Numero * Quantidade que achou +
1 * 2 = Numero * Quantidade que achou.

Quem puder dar uma ajuda, agradeço muito.

int zeros = 0;
int uns = 0;
for (char letra : sequencia) {
    if (letra == '0') {
        zeros++;
    } else if (letra == '1') {
        uns++;
    }
}
println("0: " + zeros);
println("1: " + uns);

Então cara, agradeço pela sua ajuda, se liga no que fiz na parte do processamento.

/**
* Processamento
*/

	for(int i = sequenciaInvertida.length() - 1; i >= 0; i--) {
		
		if(sequenciaInvertida.charAt(i) == '0') {
			
			valor = 0;
			contZero++;
			
			for(int x = 1; x <= contZero; x++) {

				resultado += valor * x;					
			}
			
		} else if(sequenciaInvertida.charAt(i) == '1') {
			
			valor = 1;
			contUm++;
			resultado = 0;
			
			for(int x = 1; x <= contUm; x++) {

				resultado += valor * x;					
			}
		}
	}

Eu não preciso só achar os 0 e 1, precisa também fazer um calculo cada vez que encontrar esses indices.

Isso faz parte de um curso, mas sinceramente, eu não entendi a parte do 10 ONDE.

0 * 1 + 1 * 2 (Que raio de 2 é esse?) Eu não sei te responder.
Vou deixar o professor responder e ir estudando outras coisas até lá.

O meu ficou 99% feito, mas essa parte me complicou.

Da seqüência de caracteres recebidos, a aplicação deve considerar somente os caracteres
0 e 1.
Após receber a seqüência de caracteres, a aplicação deve avaliar individualmente essa
seqüência da DIREITA para a ESQUERDA para poder calcular o resultado final que
deve acumular os valores segundo essa fórmula:
resultadoFinal = O primeiro 0 ou 1 válido vezes 1 +
O segundo 0 ou 1 válido vezes 2 +
O terceiro 0 ou 1 válido vezes 3 +
O quarto 0 ou 1 válido vezes 4 +
O n 0 ou 1 válido vezes n;

Não precisas de dois contadores (para zero e para um) apenas um único, que será o fator de multiplicação do 0 ou 1 que encontres na string.

Meu amigo,

Foi isso aqui que você quis dizer??

/**
* Processamento
*/

	for(int i = sequenciaInvertida.length() - 1; i >= 0; i--) {
		
		if(sequenciaInvertida.charAt(i) == '0' || sequenciaInvertida.charAt(i) == '1') {				
			cont++;				
		}			
		if(sequenciaInvertida.charAt(i) == '0') {				
			valor = 0;				
		} else if(sequenciaInvertida.charAt(i) == '1') {				
			valor = 1;				
		}
		
		for(int x = 1; x <= cont; x++) {
			resultado += valor * x;
		}
	}

Então, no meu código eu entendo que se eu digitasse 11 deveria sair 1 * 1 + 1 * 2 = 3 só que o resultado está sendo 4.

Ou seja, continua errado e eu não to sabendo aonde está o erro.

Para que o for no final para calcular?

for(int i = sequenciaInvertida.length() - 1; i >= 0; i--) {
	
	if(sequenciaInvertida.charAt(i) == '0' || sequenciaInvertida.charAt(i) == '1') {				
		cont++;				
				
		if(sequenciaInvertida.charAt(i) == '0') {				
    		valor = 0;				
		} else if(sequenciaInvertida.charAt(i) == '1') {				
			valor = 1;				
		}
    	resultado += valor * cont;
    }
}

Ou, simplificando, uma vez que um número multiplicado por zero dá zero e um número multiplicado por 1 dá ele próprio:

    for (int i = sequenciaInvertida.length() - 1; i >= 0; i--) {

        if (sequenciaInvertida.charAt(i) == '0' || sequenciaInvertida.charAt(i) == '1') {
            cont++;

            if (sequenciaInvertida.charAt(i) == '1') {
                resultado += cont;
            }

        }
    }

Outra coisa, chamas sequenciaInvertida mas percorres do fim para o inicio.Ou invertes antes ou percorres do fim para o início. As duas coisas em conjunto fazem com que voltes a percorrer na posição “normal”

PMLM , obrigado por tentar me ajudar, mas vamos aos casos.

Note isso abaixo.

Exemplos:
Veja os exemplos abaixo:
Entrada: 0
Processamento: (01)=0
Resultado a ser impresso: 0.0
Entrada: 1
Processamento: (1
1)=1
Resultado a ser impresso : 1.0
Entrada: 11
Processamento: (11) + (12)=3
Resultado a ser impresso: 3.0
Entrada: 10
Processamento: (01) + (12)=2
Resultado a ser impresso: 2.0

O que eu não consigo implementar é pegando entradas 0 e 1.

Aquele FOR no final, serviu para eu contar quantas entradas válidas eu tinha.

Ai eu fui multiplicando o que eu queria. Serviu até eu misturar o 1 e 0, aí avacalhou de vez e eu não to sabendo resolver. O problema que como é curso online, o professor parece não estar online nos últimos dias.

10 = 2 entradas válidas, 0 e 1.
Então eu deveria fazer.
0 * 1 + 1 * 2 = 2, mas no meu exemplo não dá esse resultado.

o FOR eu entendo que deveria percorrer de 1 até 2 e multiplicar conforme manda o exemplo, mas isso não está acontecendo, só que eu não sei por qual motivo. Porque eu entendo que esteja certo.

Só que esse exercicio está tão louco que eu mesmo já desisti de entender.

Se eu entro com 10, eu leio 01.

Só que o calculo está se baseando em 01 + 12 (É aqui que eu desisti de entender).

RESOLVIDO!

for(int i = sequencia.length() - 1; i >= 0; i–) {

		if(sequencia.charAt(i) == '0' || sequencia.charAt(i) == '1') {				
			
			if(sequencia.charAt(i) == '0') {
				cont++;
				valor = 0;
				
			} else if(sequencia.charAt(i) == '1') {
				cont++;
				valor = 1;
			}
			
			resultado += valor * cont;
			
		}
	}

Isto é igual ao que eu pus, só que eu simplifiquei porque quando valor é 0, a multiplicação é sempre 0 e quando o valor é 1 a multiplicação é sempre cont.