要約すると、ここ数日のインタビュー(なぜ直接しなかったのか)

最初は会社の話はしません。彼に顔を見せてあげてください。その時、なぜ彼を殴るための軍用パンチのセットを持っていなかったのかと不思議に思いました、そして彼の歯はあちこちにありました!彼にどのように振る舞うかを教えてください。

この会社はとても変なので、何も言いません。最初は4時だと思っていたのに、なぜそう思ったのでしょう!あまりにも多くの人がドアを踏んだ。うまくいかなかったので、予定より早く行きました。フロントデスクで登録した後、フォームへの記入が始まり、面接の質問がありました。インタビューの質問を一目で読みました。私は何も感じず、もっと基本的なことのように思えたので、記入し始めました。書き終えた後、それらの質問を読み始めました。3 ページ、それほど多くありません。実際、答えは非常に速いです。それから、私は急いで支払いませんでした。タヒョウタンではどんな薬が売られているのか見てみたいです。そこにはいくつかの質問があり、明らかにその解決方法を知っており、アイデアもあります。書き出すとなんだか物足りない。だから書かなかったんだ。しばらく考えたのはどこでしたか。その後、その男が私を促しに来ました。入れさせてください。私は、それを忘れて彼に渡しなさい、と言いました。ちょっと待ってください。担当者に電話して来てもらうように言われました。

        ここで素晴らしいことが起こります。この b は入ってくるとすぐに、「あなたは職歴はありますか?」と言いました。私はしばらくの間、「はい」と答えました。では、この質問は書けないでしょうか?もちろん。どういう考えですか?その後、人々は聞き続けなくなりました。なぜこの質問は間違っているのでしょうか? char a[] = "abcd"; sizeof(a)() とは何か、という比較的基本的な質問です。4.と書きました。これは確かに間違いです。デフォルトでは文字の末尾に「\o」が付いていますか? sizeof(a) は「\0」を直接カウントするため、5 になります。したがって、この点については無視されています。後者は基本的には正しいです。

        すると、このbが潮を吹き始めました。これが時計です、持って行きましょう!ねえ、次の質問はできません。くそ!ニウビ、大きな工場がぶら下がっています!人々を面と向かって追いかけます。この種。(大きい工場かどうかは自分で評価してください。とにかく世間が誇る基準は500人、いいやつです!年齢も若すぎず、ゲーム会社の中でも上級者と思われます。これ以上は言いたくないので、当面は中規模以上の工場として考えます。バー!)私は笑った。疑問を取り除くとは何でしょうか?? ? ? 私はしません?? または何???声を出して笑いそうになったので、あなたの質問はすべて覚えました。では、質問を取り除いたらどうなるでしょうか。本当に最高の (666) はまだこのセットをプレイしています。なんというか、本当にいいですね!今度、今度は直接ハメてやる!

彼の質問を見てみましょう。

表面的な根拠:

 char a[] = "abcd";

   char* str = a;

  char *str1 =str;

   cout<<sizeof(a)<<endl;

   cout<<sizeof(str)<<endl;

   cout<<sizeof(*str)<<endl;

   cout<<sizeof(str1)<<endl;

結果を与える: 結果を直接投稿しました (ここでは、64 ビット ポインターが 32 ビット ポインターと異なるかどうかに注意してください。したがって、結果は 2 つになります。これは意図的に穴を掘ったものです。しかし、ta の質問, そのような要件はありません。結果が与えられれば問題ありません。オペレーティング システムは 32 ビットのようですが、結果は何ですか? したがって、質問を検討するときは、必ずそれを明確に読んでください。そうでないとハングアップします。出かける前に、そして以下で話すことは何もありません。)

 もう少し難しいものもまだあります。しかし、もしその人の言うことを聞かなかったのなら、彼は怠けているのが正しいはずです。見てください!

 記述されたテストには、 new と sizeof の 2 行だけで結果が得られます。

結果を直接投稿しました。元の質問には malloc がありません。自分で追加しました。ということで、一緒に見させていただきました。

 

 それで、何か変なことはありますか?いいえ。これは、ポインタの理解を調べるためのものです。動的アプリケーションで何が起こるか。したがって、関数の転送または新しい関数を実行するときは関係なく、ta は malloc について言及しませんでしたが、問題はまだもう少し単純です。sizeof(a) の結果はポインタのサイズです。

これは基本的に説明されています。

以下はアルゴリズムの問​​題です。

何の質問?3 つの方法。A4 半分の紙を分割し、2 つのリンクされたリストを結合し、文字の重複を削除します (お分かりいただけると思います。これは文字の束を意味します。重複やバグがなくなるまで完了しません)。カエルはステップをジャンプします (これはシーケンス、考えましたが、書いていません! 最初の質問の一部を書きました。書き直すのは簡単ではないと思います。アップ!)。とても単純なことではありませんか。難しいことはないようです。

アルゴリズムに関する小さな質問を以下に書き留めてください。

1. リンク リストのマージ: 質問は次のようなものです、非常に単純な ListNode L1、要素は 1, 1, 2, 4, null; L2 6, 3, 4, 5, null これは一見すると単一のリンク リストです。構造も与えられています。マージされたリンク リスト 1、1、2、3、4、4、5、6、null が実際にはマージされソートされた ok の最後であることが必要です。それはとても簡単です。これは単なるマージソートではありませんか。答えは確かに「はい」です。しかし、それはそれほど複雑ではありません。したがって、シンプルにしてください。最初は、2 つのリンクされたリストを新しいテーブルにマージし、並べ替えるだけで完了すると考えました。タイトルの意味にも一番合致しています。ただし、この種の確認は最適な解決策ではありません。効率やスペースの無駄を考えると絶対に実現できません。このアルゴリズムの本質は、スペースを節約し、効率を向上させることです。それで、それはひっくり返されました。リライト

構造体 ListNode{

整数型;

ListNode* 次へ;

ListNode(int x) :val(x), next(NULL) {} //これは C++ クラス内での初期化メソッドです。これは Leetcobe の最初の質問だという人もいます。知りませんか?偶然ですが、本当に分かりません。

}

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) 関数本体の長さはこんな感じで、名前がわかります。だから、とにかく書き続けてください!

{ //新しいテーブル。新しいテーブルには、これら 2 つのリンクされたリストのすべての要素を保持できる新しいテーブルが必要です。これが普通の人たちの考え方です。それでL3が来ました。新しい書き方についてはまた後日書きます。

        リストノード* L3 = 新しいリストノード;        

        ListNode* temp = l3;

        for(: L1->next !=null && L2->next != null ::) //ここで誰かが、ああ、なぜあなたは役に立たないのかと言うかもしれません //効率的ではないのに。まず最初に。

        { //それから 

                        if (l1->val <l2->val) // 単語

                        {

                                temp->next =l1; //L1のポインタアドレスを取得します   

                                l1=l1->next; //L1 は下がり続けます

                        }

                        else //L2 は上記の L1 と同じ操作です

                        {

                                一時->次 =l2;

                                l2=l2->次へ;  

                        }

        temp=temp->next; //tempの終了を判断して後戻りを続ける。

//これで終わりですか、実装は本当に終わりました。ただし、リンクされたリストは、最後にまだ取得されていないものがあるかどうかを示します。

        もし(l1)

        {

        temp-next =l1;
        }

        if(l2)

        {

        temp-next =l2;
        }

l3->next を返します。

}

コードの実装を見てください

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
{
		ListNode* l3 = new ListNode();

		ListNode* temp = l3;
		while (l1 != nullptr && l2 != nullptr)
		{
			if (l1->val < l2->val) {
				temp->next = l1;
				l1 = l1->next;
			}
			else {
				temp->next = l2;
				l2 = l2->next;
			}
			temp = temp->next;
		}

		if (l1) {
			temp->next = l1;
		}
		if (l2) {
			temp->next = l2;
		}
	
		return l3->next;


		/*if (l1 == nullptr) {   //这个是递归 代码会变的更加简洁
			return l2;
		}
		else if (l2 == nullptr) {
			return l1;
		}
		else if (l1->val < l2->val) {
			l1->next = mergeTwoLists(l1->next, l2);
			return l1;
		}
		else {
			l2->next = mergeTwoLists(l1, l2->next);
			return l2;
		}*/

};

2. 文字の重複排除

例: 「aabcbcddsad」

結果: "bcbcsad"

それは言うのは簡単です!どのように解決するかを見てみましょう。最初は連聯館のような感じでした。実現方法については言及しませんでしたが、文字や文字列、コンテナを使用する必要はないため、文字が 2 つ以上繰り返されていれば問題ありません。これもleetcodeの問題だという人もいます。彼のことはあまり気にしないで、彼の書いたものを読んでみましょう!

string removeDuplicates(string s, int k) {
	//int length = -1;                            
	//while (length != s.size()) {                //时间复杂度 while 一次
	//	length = s.size();
	//	for (int i = 0, count = 1; i < s.size(); ++i) {  //for一次 
	//		if (i == 0 || s[i] != s[i - 1]) {
	//			count = 1;
	//		}
	//		else if (++count == k) {            //k这里还有一次 所以是 O(n平方/k)
	//			s.erase(i - k + 1, k);         //这里是不是很讨巧的用了string.erase()
	//			break;                         //从i-k+1的位置删除 k个。然后break掉;  
	//		}            //空间复杂度  没有多余的申请空间所以就O(1)
	//	}
	//}

//这算是暴力穷举的方法了。 时间复杂度占用过高。 那么看下ta下面给出的这个解法。vector

	vector<int> count(s.size());
	for (int i = 0; i < s.size(); ++i) {        //一次for
		if (i == 0 || s[i] != s[i - 1]) {    //当前的不等于前一个的     
			count[i] = 1;
		}
		else {
			count[i] = count[i - 1] + 1;   //cout累计
			if (count[i] == k) {            
				s.erase(i - k + 1, k);   //删除
				i = i - k;            
			}
		};
	}
            //没有多余的申请空间空间复杂度O(1), 时间复杂度就是 O(n)只跑了一次循环。

	return s;        //最后返回。
}

3. カエルが段差で飛び跳ねています。これはシリーズの問題のように見えます。本にある多くの問題に似ています。毎月どんなウサギが産むか、数か月ごとに新しいウサギが生まれ、数年後には何羽になるかを調べます。フィボナッチ数列、初期解、再帰を使用してこの問題を解決します。ただし、再帰が狭い空間で行われる場合、解は非常に速くなり、大きな数を解く効率はすぐに低下します。スタックスペースが頻繁に発生するため、40 ステップ以上ジャンプしたい場合は非効率ですか? 無限の解を書いた場合、すぐにスタックがオーバーフローしてプログラムがクラッシュします。したがって、再帰は良いように見えますが、そうではありません。そこで、ta、このbが質問を思いつきました。一気に40ジャンプするとしましょう、このアルゴリズムを書いてください。ははは^^! 直接は書いていません。それでもここで私をだまして、Bのふりをする機会を与えたいですか? 考え過ぎます。

それでアルゴリズムを書きましょう!

私は int で解決しました。より大きくジャンプしたい場合は、次のようなより大きな型を使用することを忘れないでください。

 int Faci(int n)
{
	/*if (n == 0)   
	{
		return 0;
	}
	if (n == 1)
	{
		return 1;
	}
	if (n == 2)
	{
		return 2;
	}
	else
	{
		return Faci(n - 1) + Faci(n - 2);  //这是递归
	}

	return n;*/

	 int a = 1;			
	 int b = 2;
	 int c = 0;
	 if (n == 1) {
		 return 1;
	 }
	 else if (n == 2) {
		 return 2;
	 }
	 else {
		 for (int i = 3; i <= n; i++) {			//这是迭代算法
			 c = a + b;
			 a = b;
			 b = c;
		 }
		 return c;
	 }
}

int main()
{
    int a = 40;

	int b= Faci(a);
	cout << b << endl;

}

記憶の質問: (6 つあります) それはおそらく単なる A4 紙ですが、次のプログラムを書いて実行すると結果はどうなるでしょうか。テストは実際には複雑ではありません。ただ結果を与えるだけです。したがって、メモリの問題は、おそらくそれらの側面であり、ランダムにポイントするポインタがあるのではないかと考え、ワイルド ポインタを申請しました。どうですか。ただし、最終的にはメモリ リークという問題が発生します。たぶん全部書いたし、その人が何と言ったかは見ていないので大丈夫だと思います。したがって、それを書き出す必要はありません。

taの結果を考えさせるchar* getMemory()など6つあります。

おすすめ

転載: blog.csdn.net/qq_36912885/article/details/121583495