プログラマー(Level 1-25)秘密地図

13801 ワード

質問の概要:
ニオは秘密の地図を手に持って、プロドが普段私房のお金を隠している場所を教えた.しかし、この秘密地図はデジタル暗号化されており、位置を確認するために解読が必要です.幸いなことに、地図のパスワードを解読する方法が書かれたメモも見つかった.
  • 地図は、エッジ長nの正方形の配列形式であり、各セグメントは「空白」("")または「壁」("#")の2種類から構成されています.
  • 全図は、2つの地図を重ね合わせることによって得ることができる.それぞれ「地図1」と「地図2」と言います.地図1または地図2のいずれかが壁である部分は、地図全体でも壁である.地図1も地図2も空白の部分であり、地図全体においても空白である.
  • 「地図1」と「地図2」はそれぞれ整数配列で暗号化されている.
  • 暗号化された配列は、地図の各横線において、壁部分を1に符号化し、空白部分を0に符号化したときのバイナリ数の配列である.

    ニオがフロドの私房金を手に入れるために、秘密地図のパスワードを解読するのに役立つプログラムを作成しました.
  • 実装コード:タイムアウト
    import java.util.*;
    class Solution {
        public String[] solution(int n, int[] arr1, int[] arr2) {
            String[] answer = new String[n];
            String a1="",a2="";
            for(int i=0;i<n;i++){
                a1=String.format("%0"+n+"d",Integer.parseInt(Integer.toBinaryString(arr1[i]).toString()));
                a2=String.format("%0"+n+"d",Integer.parseInt(Integer.toBinaryString(arr2[i]).toString()));
                for(int j=0;j<n;j++){
                    if(a1.charAt(j)=='1'||a2.charAt(j)=='1'){
                            if(j==0){
                                answer[i]="#";
                            }else{
                                answer[i]=answer[i]+"#";
                            }
                    }else{
                            if(j==0){
                                answer[i]=" ";
                            }else{
                                answer[i]=answer[i]+" ";
                            }
                    }
                        
                }
            }
            return answer;
        }
    }
    String.format実装を使用すると、2つのタイムアウトが発生します.そしてcharatで比較して、やる必要はなく、replaceでいいです.
    Integer.toBinaryString(i);//にしんすう
    Integer.toOctalString(i); //8進法
    Integer.toHexString(i);//16進数関数しかし、このように解く過程には学ぶべきところがたくさんあります.
    その他のフォルダコード
    class Solution {
        public String[] solution(int n, int[] arr1, int[] arr2) {                
            String[] answer = new String[n];
            for (int i = 0; i < n; i++) {
                answer[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
                answer[i] = answer[i].replace('0', ' ');
                answer[i] = answer[i].replace('1', '#');
    
                while (answer[i].length() < n) {
                    answer[i] = ' ' + answer[i];
                }
            }
            return answer;
        }
    }
    TOBinaryStringがビット演算できるかどうか初めて知りました.本当に簡単な質問です
    シード演算はAND:&、OR:|XOR:^NOT:~として使用できます.