algoritmo Offer-- para provar as questões de segurança e idéias de solução de problemas

Bidimensional pesquisa matriz

Descrição do título
(o mesmo que o comprimento de cada matriz unidimensional) em uma matriz bidimensional, cada fila da esquerda para a direita em ordem de tipo ascendente, para classificar cada coluna de cima para baixo, de modo a aumentar. Uma função completa, introduzir uma matriz tal bidimensional e um número inteiro, é determinado se a matriz contém o número inteiro.

idéias de solução de problemas: Matrix é ordenado, no canto inferior esquerdo do ponto de vista, os números estão diminuindo, o número certo está aumentando, assim que começar olhando a partir do canto inferior esquerdo, quando você está olhando para os números grandes que o canto inferior esquerdo, passo certo ; quando você está olhando por horas digitais, movendo-se um passo.

/*
	@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;
}

Não faça adição e subtração, multiplicação e divisão

Título Descrição
escrever uma função, e a soma de dois inteiros, a função não pode ser utilizado in vivo requer +, -, *, / quatro símbolos aritméticos.

Esboço de Solução: valores binários calculados usando uma maneira de três passos por adição de:

  1. Os membros da agregação de valor, não um carry. Cada equivalente binário da soma você faz operação XOR (^).
  2. valor Carry é calculado. Eu faço o equivalente com a operação (&), então o esquerdo.
  3. Repetir os dois passos anteriores até que o transporte é 0, em seguida, para fora do circuito.

exp: 5 (101) 7 (0111)

  1. 101 ^ 111 == 010
  2. (101 e 111) << 1 == 1010
  3. Repetir o procedimento acima duas etapas, 0010 ^ == 1010 1000, (0010 & 1010) << 1 == 0100.
    repetidas, 1000 ^ == 0100 1100, (1000 & 0100) == 0 << 1, fora do circuito, o 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;
}

substituir espaços

Título Descrição
Por favor implementar uma função, uma corda para substituir cada espaço com "20%". Por exemplo, quando a corda Eu sou um menino bonito. Após a string após a substituição de I% 20Am% 20A% 20Handsome% 20Boy.

Resolução de problemas idéias: Substitua frente para trás, a parte de trás dos personagens de ser constantemente se movendo para trás, para mover várias vezes, de modo ineficiente. Mover-se de trás para a frente, primeiro calcular quanto espaço é necessário, e em seguida, passar por trás, cada personagem pode mover apenas uma vez, um pouco mais eficiente.

/*
	@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 reversa

Descrição Título
de entrada de uma lista ligada, a lista ligada após a inversão, a saída do novo cabeçalho.

ideias de resolução de problemas:
Aqui Insert Picture Descrição

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成为新的头结点
}

escadas do salto de rã

Descrição do problema
Um sapo pode saltar uma vez um nível 1, nível 2 também pode saltar sobre. O sapo pulou buscando um total de n nível de ensino como muitos saltos. (Contagem de prioridades diferentes para diferentes resultados)

idéias de solução de problemas: o número de colunas com a mesma solução Fibonacci, nada a dizer.

Quando N = 1, uma espécie salta;
quando n = 2, há dois saltos;
quando n = 3, existem três tipos de saltos;
quando n = 4, os cinco tipos de saltos;
......
quando o n-; ter 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;
}

nível anormal

Descrição Título
rã passos pode-se saltar fase 1, fase 2 pode saltar salto ...... pode ser n fases. O sapo pulou buscando um total de n nível de ensino como muitos saltos.

Esboço de Solução:
(. 1). F 1 =
F (2) = F (2-1) + F (2-2) // F (2-2) representa uma segunda ordem hop frequência fase 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)

Descrição:

  1. Em que f (n) representa 1,2, ...... n tem um número de fases de ordem n método passo salto.
  2. n = 1, apenas um tipo de método de salto, F (1) = 1
  3. Quando n = 2, haverá dois saltos, um grau 1 ou 2. f (2) = F (0) + f (1)
  4. Quando n = 3, haverá três tipos de saltos, um nível de 1, 2 ou 3. A primeira fase é então saltam de volta descansar 1: f (3-1); primeira fase de salto 2, o f restante (3-2); os três primeiros fora do restante f (3-3) . Assim, conclui que: F (3) = f (3-1) + f (3-2) + f (3-3)
  5. Quando n = n, n tipos de método de salto vai, um nível 1, nível 2 ... n estágios. Concluiu-se 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).
    Pode ser reduzida a: f (n) = 2 * f (n-1)
  6. Concluiu-se que:
    F (n-) n- = 0 quando f (n) = 0; f (n) = 1 quando f (n) = 1; n > = 2 quando 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;
}

Ajustar a ordem da matriz de modo que, em frente do par-ímpar

Descrição Título
de entrada de uma matriz de números inteiros, para realizar uma função de ajustar a ordem dos números na matriz, de tal forma que toda a parte ímpar de metade da frente da matriz, a matriz está localizada na segunda metade de todos mesmo e assegurar entre pares e ímpares, pares e ímpares as posições relativas inalterada.

exemplo:

Entrada: [1234567]
Saída: [1357246]

idéias de solução de problemas:
semelhantes a bubble sort, antes e depois do par e ímpar trocadas.

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 artigos originais · ganhou elogios 5 · Vistas 1512

Acho que você gosta

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