Programación en línea de Alibaba Cloud Tianchi 30 de enero Concurso semanal n. ° 56

Tabla de contenido

1. Calcula los números

En segundo lugar, la subcadena menos dividida

Tres, reflejo de espejo


1. Calcula los números

Dificultad: fácil 

Descripción del Título

Dado un número decimal num, ahora necesita convertirlo a un número binario y devolver el número y la posición de 1.

  • n <= 10 ^ 9

Ejemplo

Ejemplo 1:

输入: 10
输出: [2,1,3]
解释: 10转成2进制为1010,总共有2个1,所以ouptput数组第一个是2。然后1的位置是第1个和第3个,所以后续两个数为1,3.

Ejemplo 2:

输入: 7
输出: [3,1,2,3]
解释: 7转成2进制为111,总共有3个1,所以output数组第一个是3。然后的位置是第1个、第2个和第3个,所以后续三个数为1,2,3.

 Mi solución:

public class Solution {
    /**
     * @param num: the num
     * @return: the array subject to the description
     */
    public int[] calculateNumber(int num) {
        int t, x, y = 0, i;
        String s = "";
        x = num;
        while (x != 0) {
            t = x % 2;
            x /= 2;
            if (t == 1)
                y++;
            s = t + s;
        }
//        System.out.println(s);
        int[] r = new int[y + 1];
        r[0] = y;
        int j=1;
        for (i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '1')
                r[j++] = i + 1;
        }
        return r;
    }
}

En segundo lugar, la subcadena menos dividida

Dificultad: fácil

Descripción del Título

Dada una cadena que contiene  n letras minúsculas, la cadena debe dividirse en varias subcadenas continuas, la letra en la subcadena debe ser la misma y el número de letras en la subcadena no exceda  k, y generar el número mínimo de subcadena que cumpla con el requisito.

Traducción: Dada una cadena que contiene n letras minúsculas, la cadena debe dividirse en varias subcadenas consecutivas, las letras en la subcadena deben ser las mismas y el número de letras en la subcadena no excede k, y la salida satisface el mínimo número de subcadenas necesarias.

  • n≤1e5

Ejemplo

Ejemplo 1

输入: s = "aabbbc", k = 2
输出: 4
解释:
划分成 "aa", "bb", "b", "c" 四个子串

Ejemplo 2

输入: s = "aabbbc", k = 3
输出: 3
解释: 
划分成 "aa", "bbb", "c" 三个子串

El tema es fácil de entender mirando directamente el ejemplo.

Mi solución:

public class Solution {
    /**
     * @param s: the string s
     * @param k: the maximum length of substring
     * @return: return the least number of substring
     */
    public int getAns(String s, int k) {
        int l = 0, c = 0, i, j;
        while (c < s.length() - 1) {
            j = c + 1;
            i = 1;
            while (i < k && j<s.length()-1&&s.charAt(c) == s.charAt(j)) {
                j++;
                i++;
            }
            l++;
            c += i;
        }
        if (s.charAt(s.length()-1)!=s.charAt(s.length()-2))
            l+=1;
        return l;
    }
}

Tres, reflejo de espejo

Dificultad: media

Descripción del Título

Hay una habitación cuadrada especial con un espejo en cada pared. Además de la esquina suroeste, cada rincón coloca un receptor, número  0, 1como bien  2.

La longitud de la pared de la habitación cuadrada es  p, un rayo de láser desde la esquina suroeste se encontrará primero con la pared este, y 0 la distancia entre el punto incidente y el receptor  es  q .

Devuelve el número del receptor que la luz encuentra primero (garantía de que la luz eventualmente encontrará un receptor).

  • 1 <= p <= 1000
  • 0 <= q <= p

Ejemplo

https://lintcode-media.oss-us-west-1.aliyuncs.com/problem/reflection.png

Ejemplo 1:

输入: p = 2, q = 1
输出: 2
解释: 这条光线在第一次被反射回左边的墙时就遇到了接收器 2 。

Ejemplo 2:

输入: p = 3, q = 1
输出: 1
解释: 这条光线在第一次被反射回左边的墙时就遇到了接收器 1 。

 La solución puede ser encontrar una regla y descubrir varias situaciones en las que la luz de reflexión especular llega al receptor dibujando una imagen.

p / q = 1, llegar a 1; p / q = 2, llegar a 2; p / q = 3, llegar a 1; p / q = 4, llegar a 2; …… ( División aquí significa división )

Cuando p = 3 y q = 2, p / q = 3/2. ¿A cuál llegar?

La tabla de acción de la mano encontró que llegó a 0.

A partir de esto, se puede pensar que el resultado divisible será 1, e irá al receptor 1; el divisor será 2, que irá al receptor 2; y los demás resultados no divididos irán al receptor 0.

 Sin embargo, esto no significa que las tres situaciones hayan sido consideradas en su totalidad, y corresponden a la situación de cada receptor.

Por ejemplo, p = 5, q = 3, p / q = 5/3, en realidad llegará al receptor 1, que no se ajusta a la regla supuesta anterior, ¡así que busque la regla más a fondo!

Encuentra la regla es:

  1. Cuando p es un número impar y q es un número impar, llega al receptor 1.
  2. Cuando p es un número impar yq es un número par, llega al receptor 0.
  3. Cuando p es un número par yq es un número impar, llega al receptor 2.

El caso de que p y q sean números pares se puede reducir a uno par y otro impar, lo que equivale a uno de los casos anteriores.

public class Solution {
    /**
     * @param p: an integer
     * @param q: an integer
     * @return: the number of the receptor that the ray meets first
     */
    public int mirrorReflection(int p, int q) {
        if(p%2==1&&q%2==1)
            return 1;
        else if(p%2==1&&q%2==0)
            return 0;
        else
            return 2;
    }
}

 Esta es la primera vez que traté de responder preguntas en programación en línea en Ali Tianchi, y también fue la primera vez que respondí preguntas en Java. Este artículo escribe principalmente sobre la tercera pregunta: el pensamiento y la respuesta a los resultados de la reflexión en espejo. La primera y las segundas preguntas son relativamente simples La respuesta es fácil de ver en el código.

Si cree que es bueno, bienvenido a "un clic, tres vínculos", haga clic en Me gusta, marque como favorito, siga, comente directamente si tiene alguna pregunta, e intercambie y aprenda.


Mi blog de CSDN: https://blog.csdn.net/Charzous/article/details/113444688

Supongo que te gusta

Origin blog.csdn.net/Charzous/article/details/113444688
Recomendado
Clasificación