Offer-- algoritmo para demostrar los problemas de seguridad y las ideas de resolución de problemas

Bidimensional matriz de búsqueda

Descripción Título
(igual que la longitud de cada matriz unidimensional) en una matriz bidimensional, cada fila de izquierda a derecha en el orden de ascendente en orden, para ordenar cada columna, de arriba abajo en orden creciente. Una función completa, entran en una matriz tal de dos dimensiones y un número entero, se determina si la matriz contiene el número entero.

Ideas de resolución de problemas: Matriz se ordena, la esquina inferior izquierda desde el punto de vista, los números están disminuyendo, el número correcto es cada vez mayor, por lo que empezar a buscar desde la esquina inferior izquierda, cuando usted está buscando grandes números que la esquina inferior izquierda, paso correcto ; cuando se está buscando horas digitales, subiendo un paso.

/*
	@param: arr二位数组,target要查找的数字
	@return: 当二位数组中存在要找查找的数字,则返回 1,否则返回 0 
*/
int find(int arr[][N], int target)
{
	int i = N - 1;	//从左下角开始
	int j = 0;
	while(i >= 0 && j < N)
	{
		if(target == arr[i][j])	//找到要查找的数字
			return 1;
		if(target > arr[i][j])	//比左下角的数字大,右移一步
			j++;
		else	//比左下角的数字小,向上移动一步
			i--;
	}
	return 0;
}

No hacer la suma y la resta, multiplicación y división

Título Descripción
escribir una función, y la suma de dos números enteros, la función no se pueden utilizar en vivo requiere +, -, *, / cuatro símbolos aritméticos.

Esquema de Solución: valores binarios calculados usando un modo de tres pasos mediante la adición de:

  1. Los miembros de la adición de valor, no un acarreo. Cada binario equivalente de la suma que hacer operación XOR (^).
  2. se calcula el valor de llevar. Hago el equivalente con la operación (y), y luego el izquierdo.
  3. Repita los dos pasos anteriores hasta que el arrastre es 0, entonces fuera del bucle.

exp: 5 (101) 7 (0111)

  1. 101 ^ == 111 010
  2. (101 y 111) << 1 == 1010
  3. Repetir lo anterior dos pasos, 0010 ^ == 1010 1000, (0010 y 1010) << 1 == 0100.
    repetidas, 1000 ^ == 0100 1100, (1000 y 0100) == 0 << 1, fuera del circuito, el retorno de 1100 (12) .
int Add(int num1, int num2)
{
	int sum, carry;
	while(0 != num2)
	{
		//对应位相加但不进位,用异或实现
		sum = num1^num2;
		//记下进位,用与 和 移位实现
		carry = (num1&num2)<<1;
		num1 = sum;
		num2 = carry;
	}
	return num1;
}

sustituir los espacios

Título Descripción
favor de implementar una función, una cadena para reemplazar cada espacio a "20%". Por ejemplo, cuando la cadena I Am Un muchacho hermoso. Después de la cadena después de la sustitución de I% 20AM% 20A% 20Handsome% 20Boy.

La resolución de problemas las ideas: Reemplazar adelante hacia atrás, la parte posterior de los personajes que se mueve constantemente hacia atrás, para mover varias veces, de modo ineficiente. Pasar de atrás hacia delante, en primer lugar calcular cómo se necesita mucho espacio, y luego pasar a la parte de atrás, cada personaje puede moverse solamente una vez, por lo que un poco más alta eficiencia.

/*
	@param: str字符串
*/
void replaceSpace(char *str)
{
	int Oldlen = 0;	//记录字符串原来的长度
	int cnt = 0;	//记录空格的数量
	int Newlen;	//记录插入后的长度
	while(str[Oldlen] != '\0')	//遍历一遍字符串找出空格的数量
	{	
		if(str[Oldlen] == ' ')
			cnt++;
		Oldlen++;
	}
	Newlen = Oldlen + 2*cnt;	//插入后的长度,不用减一因为隐藏个'\0'也要算上
	if(Newlen > max_size)	//如果计算后的长度大于总长度就无法插入
		returnwhile(Oldlen >= 0 && Newlen > Oldlen)	//放字符
	{
		if(str[Oldlen] == ' ')	//碰到空格就替换
		{
			str[Newlen--] = '0';
			str[Newlen--] = '2';
			str[Newlen--] = '%';
		}
		else	//不是空格就将Oldlen指向的字符放入Newlen指向的位置
			str[Newlen--] = str[Oldlen];
		Oldlen--;	//不管是if还是else,Oldlen都要前移
	}
}

lista inversa

Descripción Título
de entrada de una lista enlazada, la lista enlazada después de la inversión, la salida de la nueva cabecera.

Ideas de resolución de problemas:
Aquí Insertar imagen Descripción

ListNode* ReverseList(ListNode* pHead)
{
	if(NULL == pHead)	//判断链表是否为空
		return NULL;
	ListNode* pre = NULL;
	ListNode* next = NULL;
	while(pHead)
	{
		next = pHead->next;
		pHead->next = pre;
		pre = pHead;
		pHead = next;
	}
	return pre;	//pre成为新的头结点
}

escaleras de salto de rana

Descripción del problema
Una rana puede saltar una vez al nivel 1, nivel 2 también puede saltar. La rana saltó en busca de un total de n del nivel de grado el número de saltos. (Count diferentes prioridades a diferentes resultados)

Ideas de resolución de problemas: el número de columnas con la misma solución de Fibonacci, nada que decir.

Cuando n = 1, de una especie saltos;
cuando n = 2, hay dos saltos;
cuando n = 3, hay tres tipos de saltos;
cuando n = 4, las cinco clases de saltos;
......
cuando el n-; tener f (n-1) + f (n-2) tipos de saltos;

int jumpFloor(int number)
{
	if(number <= 2)
		return number;
	int num1 = 1;
	int num2 = 2;
	int tmp;
	int i;
	for(i=2; i<number; i++)
	{
		tmp = num1 +num2;
		num1 = num2;
		num2 = tmp;
	}
	return num2;
}

nivel anormal

Descripción Título
rana pasos uno puede saltar la etapa 1, etapa 2 puede saltar salto ...... puede ser n etapas. La rana saltó en busca de un total de n del nivel de grado el número de saltos.

Esquema de Solución:
(. 1). F 1 =
F (2) = F (2-1) + F (2-2) // F (2-2) representa un segundo orden de salto de frecuencia etapa 2
f (3) = F (3-1) + F (3-2) + F (3-3)
......
F (n-) = F (n-- 1.) + F (n - 2) + F + ...... (3-n-). + f (N- (n-1 )) + f (nn)

Descripción:

  1. Donde f (n) representa 1,2, ...... n tiene un número de etapas n-ésimo paso de procedimiento salto.
  2. n = 1, sólo un tipo de método de salto, f (1) = 1
  3. Cuando n = 2, habrá dos saltos, un grado 1 o 2. f (2) = f (0) + f (1)
  4. Cuando n = 3, habrá tres tipos de saltos, un nivel 1, 2 o 3. La primera etapa es entonces rebotar descansar 1: f (3-1); primera etapa salto 2, la f restante (3-2); los tres primero fuera de la f restante (3-3) . Por lo tanto la conclusión de que: f (3) = f (3-1) + f (3-2) + f (3-3)
  5. Cuando n = n, n tipo de método de salto se quiere, un nivel 1, nivel 2 ... n etapas. Concluyó que: f (n) = f ( n-1) + f (n-2) + ...... + f (N- (n-1)) + f (nn) ----> f (0) + f (1) + f ( 2) + f (3) + ...... + f (n-2) + f (n-1).
    Se puede reducir a: f (n) = 2 * f (n-1)
  6. Se concluyó que:
    F (n-) n- = 0 cuando f (n) = 0; f (n) = 1 cuando f (n) = 1; n > = 2 cuando f (n) = 2 * f (n- 1).
int jumpFloorII(int number)
{
	if(0 == number || 1 == number)
		return number;
	int i;
	int power = 2;
	for(i=2; i<number; i++)
	{
		power *= 2;
	}
	return power;
}

Ajuste el orden de la matriz de modo que delante de la par-impar

Descripción Título
de entrada una matriz de enteros, para realizar una función para ajustar el orden de los números en la matriz, de manera que toda la parte impar de la mitad delantera de la matriz, la matriz se encuentra en la segunda mitad de todo incluso y asegurar entre pares e impares, pares e impares las posiciones relativas sin cambios.

Ejemplo:

Entrada: [1234567]
Salida: [1357246]

La resolución de problemas: las ideas
similares a la ordenación de burbuja, antes y después del intercambio de pares e impares.

void reOrderArray(int *array, int len)
{
	int i, j;
	for(i=0; i<len-1; i++)
	{
		for(j=len-1; j>i; j--)
		{
			//前偶后奇,则交换
			if(!(array[j-1]&1) && array[j]&1)
			{
				array[j] = array[j]^array[j-1];
				array[j-1] = array[j]^array[j-1];
				array[j] = array[j]^array[j-1];
			}
		}
	}
}
Publicado 50 artículos originales · ganado elogios 5 · Vistas 1512

Supongo que te gusta

Origin blog.csdn.net/qq_42483691/article/details/104940912
Recomendado
Clasificación