(Niuke.com)Huaweiマシンテスト(2)

(Niuke.com)Huaweiマシンテストの質問セットの回答

問題を解決する前に、入力に便利なojブラッシング問題の固定フォーマットコードの波を共有してください

import java.util.*;
import java.io.*;
public class Main{
    
       //一定要使用Main作为类名
    public static void main(String args[]){
    
    
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()){
    
    
            
        }
    }
}

C ++を使用している場合:

#include<bits/stdc++.h> //万能头文件,超级好用
using namespace std;
int main(){
    
    
    int num;
    while(scanf("%d",&num)!=EOF){
    
      //这里用cin也可以,个人喜好scanf(),因为一个有趣的手势(哈哈哈)       
    }
}

5番目の質問HJ104文字列セグメンテーション

主題の要件ここに画像の説明を挿入しますここに画像の説明を挿入しますここに画像の説明を挿入します

アイデア:

入力データを直接判断します。入力文字列の長さが8の倍数であるかどうか、8の倍数である場合は気にしないでください。そうでない場合は、文字列の後ろに欠落しているゼロの数を追加するだけです。強制的に8にします。乗算してから、substring関数を使用して文字列をインターセプトし、8番目ごとに1行を出力します。問題を解決するためにPythonを使用する場合は、スライス操作を実行できるため、より簡単です。

import java.util.Scanner;
public class Main{
    
    
    public static void main(String args[]){
    
    
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()){
    
    
            int n=scanner.nextInt();
            for(int i=0;i<n;i++){
    
    
                String words = scanner.next();
                while(words.length()%8!=0){
    
    
                    words +="0";
                }
                for(int j=0;j<words.length();j+=8){
    
    
                    System.out.println(words.substring(j,j+8));
                }
            }
        }
    }
}

Python化されている場合は、それだけです(Pythonは自分で作成したものではありません)

while True:
    try:
        a= int(input())
        for i in range(a):
            s=input()
            while len(s)>8:
                print(s[:8])
                s=s[8:]
            print(s.ljust(8,"0"))
    except:
        break

質問6:HJ103Redraimentを移動する方法

主題の要件

ここに画像の説明を挿入しますここに画像の説明を挿入します

アイデア:

最初は戸惑いながらこの質問を見て、その意味がわからなかったのですが、よく見てみると、その本質が最長の昇順部分列であることがわかりました。そのため、この問題はより単純になりました。動的計画法を学ぶ前に、直接かつ激しく行う必要があります。ただし、この種の問題は基本的に時間の経過とともに激しくなるため、時間のある空間の使い方を学ぶ必要があります。レコードへの変更を探しながら、最初に配列を開いてデータの一部を記録します。この配列を使用して、各数値の現在の位置に現れる可能性のある最長の増分サブシーケンスの長さを記録し、反復的なアイデアを使用して長さを見つけます。動的計画法の具体的なアイデアは次のとおりです:
例:与えられた長さ66、2、5、1、4、5}の配列A {、単調に増加する最長のサブシーケンスは{1、4、5}または{1、4、5}であり、長さは3です。
d [i]を、任意のA [i]を終了要素とする最長増加部分列の長さとし、iの前にあり、A [i]よりも小さいすべての要素A [j]を見つけると、次のようになります。 :
(1)たとえば、i = 2の場合、A [i] = 5、A [i]よりも小さい要素はA [1] = 2であり、A [i]よりも小さいすべての要素をAで取得します。 [j]、対応するd [j]は最大のプラス1、つまりd [i] = max {d [j]}です。ここで、j <iおよびA [j] <A [i];
(2)見つからない場合、たとえばi = 3の場合、A [3] = 1であり、iの前に1より小さい要素はありません。この時点で、A [3] = 1だけが増加するサブシーケンスd [を構成します。 i] = 1。
i = 0の場合、この時点でA [0] = 6の場合、1つの要素のみがサブシーケンスを構成します。この場合、d [0] = 1です
。i= 1の場合、この時点でA [1] = 2です。 i = 3 1より小さい要素はありませんでした。つまり、d [1] = d [0] = 1です
。i= 2の場合、A [2] = 5であり、A [2]より小さい要素はAです。 [1] = 2、対応するd [j]の最大のd [1] = 1を取ります。つまり、i = 2の場合、対応する最長の増分サブシーケンス長はd [2] = d [1] + 1 = 2;
i = 3の場合、この時点でA [3] = 1、i = 3の前に1より小さい要素はありません。つまり、d [3] = 1です
。i= 4の場合、この時点でA [4] = 4、A [4]よりも小さい要素は2と1です。2つの要素があります。対応する最大のd [j] d [1] = d [3] = 1、つまりiに対応する最長増加部分列を取ります。 = 2長さはd [4] = d [1] + 1 = 2である必要があります
。i= 5の場合、この時点でA [5] = 5であり、最初の5つの要素は1、2、4であり、最大になります。 d [j]は、j = 4の場合、この時点でd [4] = 2です。つまり、i = 5に対応する最長増加部分列の長さはd [5] = d [4] + 1 = 3です。
最後に、開いた配列を反復処理して、最長増加部分列である最大数を見つけます。単純に聞こえますか?コードを書くのに便利なように、Javaに付属のMath.max()関数を使用して効率を向上させます。

import java.util.*;
public class Main{
    
    
    public static void main(String[] args){
    
    
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNextInt()){
    
    
            int count = scanner.nextInt();
            int[] A = new int[count];
            for(int i=0;i<count;i++){
    
    
                A[i]= scanner.nextInt();
            }
              
            System.out.println(good(count, A));  //dp函数部分
        }
    }
        public static int good(int a,int[] b){
    
    
        int[] dp = new int[a];
        int max=1;
        for(int i=0;i<a;i++){
    
    
            dp[i]=1;
            for(int j=0;j<i;j++){
    
    
                if(b[j]<b[i]){
    
    
                dp[i]=Math.max(dp[i],dp[j]+1);
                }
            }
            max=Math.max(dp[i],max);
        }
        return max;
    }
}

最近の自宅での大雨による頻繁な停電のため、今日は2つの質問を書き、1日2〜4の質問に努めました。チェックは勝利です。機械の質問を磨く方法を学び始めたら、みんな一生懸命頑張ります。一緒!

良い良い勉強、一日中!(一生懸命勉強し、毎日改善する)

葬式を予見して、次回は分解を聞いてください!

次の投稿アドレス:(Niuke.com)Huaweiマシンテスト(3)

おすすめ

転載: blog.csdn.net/qq_41606378/article/details/107328047