安全性の問題と問題解決のアイデアを証明するOffer--アルゴリズム

二次元配列の検索

説明タイトル
昇順に上から下へ各列を並べ替えるために、ソート昇順の順に左から右へ、二次元アレイ、各行(各一次元配列の長さと同じ)。完全な機能は、そのような二次元アレイと整数を入力し、配列の整数が含まれているか否かが判断されます。

アイデアを問題解決:あなたは左下隅、右のステップよりも大きな数字を探しているときマトリックスは、その左下隅から探し始め、数字が減少しているまで、右の数が増加している、という観点から、左下隅を命じています;あなたはデジタル時間を探しているとき、一歩を上に移動。

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

足し算と引き算、掛け算と割り算をしないでください

タイトル説明
書込み機能、および2つの整数の和は、機能がインビボで使用されなくてもよい+が必要、 - 、*、/四則記号。

ソリューションの概要:追加することによって、三段階の方法を用いて計算バイナリ値:

  1. 値ではなく、キャリーを追加するメンバー。あなたはXOR(^)の操作を行う和の各バイナリ同等。
  2. キャリー値が算出されます。私はと同等(&)の操作、そして左のいずれかの操作を行います。
  3. キャリーは、次にアウトループの、0になるまで、上記2つのステップを繰り返します。

EXP:5(101)7(0111)

  1. 101 ^ 111 == 010
  2. (101&111)<< 1 == 1010
  3. 二つのステップ、1000 ^ == 1010 0010、(0010&1010)<< 1 == 0100上に繰り返し
    繰り返し、1100 ^ == 0100 1000、(1000&0100)== 0 << 1、ループのうち、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;
}

スペースを交換してください

タイトル説明
、にそれぞれのスペースを置き換えるために、文字列関数を実装してください「20%。」例えば、文字列IアムAハンサムボーイ。I%20Am%20A%20Handsome%の置換後文字列の後 20Boy。

問題解決のアイデア:、背面にフロントを交換した文字の後ろには常に後方に移動されるように、数回に移動するので、非効率的。奥から手前に移動し、多くのスペースが必要で、その後、後ろから移動する方法を最初の計算では、各文字が少しだけ、より効率的で、一度に移動することができます。

/*
	@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都要前移
	}
}

リバースリスト

説明タイトル
入力リンクリスト、反転後のリンクされたリスト、新しいヘッダの出力。

問題解決のアイデア:
ここに画像を挿入説明

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

カエルのジャンプ階段

問題説明
Aカエルは、レベル1回ジャンプすることができ、レベル2はまた、上にジャンプすることができます。カエルはどのように多くのジャンプのn級レベルの合計を求めて飛び込みました。(異なる結果に異なる優先順位をカウント)

問題解決のアイデア:同じフィボナッチ・ソリューション、何も言うことと列の数。

; n = 1の場合、一つの種ジャンプ
N = 2が存在するときに、2つのジャンプ;
n = 3の場合、ジャンプの3種類があり;
n = 4の場合、ジャンプの5種類;
......
Fを有する(N-1)+ F;場合N- (N-2) ジャンプの種類。

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段よい......一つはジャンプをジャンプすることができるステージ1、ステージ2をジャンプできる手順。カエルはどのように多くのジャンプのn級レベルの合計を求めて飛び込みました。

ソリューションの概要:
(1)F 1 =
F(2)= F(2-1)+ F(2-2)// F(2-2)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)

説明:

  1. ここで、f(n)は、1,2を表し、...... n段の数N番目のステップジャンプ方法を有しています。
  2. N = 1、ジャンプ方法の一種類で、f(1)= 1
  3. n = 2の場合、2つのジャンプ、グレード1または2が存在することになります。F(2)= F(0)+ F(1)
  4. n = 3の場合、ジャンプの三種類、レベル1、2又は3が存在することになります。;最初のジャンプステージ2、残りF(3-2);残りF(3-3)の最初の三つのうちF(3-1):第一段階は、次に1を休ま立ち直るれます。したがって結論:F(3)= F(3-1)+ F(3-2)+ F(3-3)
  5. 場合N = N、Nジャンプ方法の種類であろう、レベル1、レベル2 ... n段。結論: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)。
    還元することができる:F(N)= 2 * F(N-1)
  6. :これは、と結論づけ
    F; N- = 0のときF(N)= 0:(N)F (N)= 1のときF(N)= 1; N > = 2のとき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;
}

偶奇の前になるようにアレイの順序を調整します

説明タイトル
アレイの前半のすべての奇数部分、アレイがあっても全ての後半に位置し、奇数と偶数、奇数と偶数の間に確保されるような入力アレイ内の数字の順序を調整する機能を実現するための整数の配列、相対位置変わらず。

例:

入力:[1234567]
出力:[1357246]

問題解決のアイデア:
バブルソートに似て、前と偶数と奇数の交換後。

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];
			}
		}
	}
}
公開された50元の記事 ウォンの賞賛5 ビュー1512

おすすめ

転載: blog.csdn.net/qq_42483691/article/details/104940912