408 King's Road Estructura de datos Ejercicios de código después de clase (5)

¡Acostúmbrate a escribir juntos! Este es el noveno día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .

Está planeado actualizar la implementación de todos los ejercicios de código extraescolares en la estructura de datos de King's Road 23. Aunque los exámenes generalmente están escritos en pseudocódigo, los he implementado todos debido al trastorno obsesivo-compulsivo. El almacén está aquí.

  • Mesa lineal

2.2.3, 10

imagen.png

  • Esta pregunta real es básicamente la misma que la pregunta 8, podemos copiarla directamente y cambiar los parámetros.
  • El primero es resolver violentamente, abrir una nueva matriz y copiarla por separado (es lo mismo cambiar la estructura a una matriz)
  • Esta complejidad temporal es O(n), y la complejidad espacial también es O(n)
  • Para ahorrar espacio, también puede crear una matriz de tamaño p para almacenar temporalmente la matriz anterior [0, p-1], mover la matriz original hacia la izquierda como un todo y luego volver a colocarla en secuencia, la complejidad del espacio se reducirá a O(p)
void change(SqList &list, int p, int n) {
  // 1.左右两个数组分别是[0, p-1], [p, n-1]
  SqList copied = list;
  int k = -1;
  // 2.分别复制进去
  for (int i = p; i < n; i++) {
    copied.data[++k] = list.data[i];
  }
  for (int i = 0; i < p; i++) {
    copied.data[++k] = list.data[i];
  }
  // 3.新换旧
  list = copied;
}
复制代码
  • Cuatro o dos marcan mil libras, todo se invierte y luego se invierte por separado
  • Por ejemplo, [1, 2, 3, 4] se invierte en [4, 3, 2, 1], luego una de las matrices [4, 3] se invierte en [3, 4] y la otra [2, 1] se invierte Establecer en [1, 2], el resultado final es [3, 4, 1, 2]
  • Complejidad temporal O(n), complejidad espacial O(1)
void reverse(SqList &list, int l, int r) {
  if (l > r || r > list.length) return;

  for (int i = 0; i < (r-l+1)/2 ; i++) {
    swap(list.data[l+i], list.data[r-i]);
  }
}

void change2(SqList &list, int p, int n) {
  // 注意参数
  reverse(list, 0, n);
  reverse(list, 0, p);
  reverse(list, p, n);
}
复制代码

2.2.3, 11

imagen.png

  • Encuentre la mediana después de fusionar dos secuencias ordenadas, luego la solución violenta se fusionará directamente.
  • Puede copiar la pregunta 7 directamente y luego volver al número en la (A.length + B.length)/2posición
  • Entonces encontrará que no necesita fusionar todo, y no necesita una tabla auxiliar para almacenar datos, solo necesita recorrer esta posición.
  • Preste atención a los requisitos en el título, mid debe ser igual a(A.length + B.length - 1) / 2
  • Complejidad temporal O(n), complejidad espacial O(1)
int merge(SqList A, SqList B) {
  int i = 0, j = 0, k = -1, mid = (A.length + B.length - 1) / 2;
  
  // 条件也不需要,因为我们找到中间值就会直接return
  while (1) {
    ++k;
    if (A.data[i] <= B.data[j]) {
      if (k == mid) return A.data[i];
      i++;
    } else {
      if (k == mid) return B.data[j];
      j++;
    }
  }
}
复制代码
  • También puede hacer un bucle directamente a la mitad, no necesita juzgar cada vez==mid
int merge2(SqList A, SqList B) {
  int i = 0, j = 0, mid = (A.length + B.length - 1) / 2 ;
  while (i+j < mid) {
    if (A.data[i] <= B.data[j]) i++;
    else j++;
  }
  return A.data[i] < B.data[j] ? A.data[i] : B.data[j];
}
复制代码
  • La solución óptima no se recomienda para el examen, el costo de tiempo es demasiado alto (excepto para los grandes), después de todo, la solución violenta parece tener una brecha de solo 5 puntos como máximo, es innecesaria
  • No lo escribiré aquí, puedes ver la respuesta de Wangdao.

Supongo que te gusta

Origin juejin.im/post/7085255116026019847
Recomendado
Clasificación