26日間のアルゴリズム


パラメータは自然数nを与える.nを三進法で前後に逆さまにし、それを十進法で表す数で返し、解関数を完成させる.
せいげんじょうけん
nは10000000を超える自然数である.
I/O例
n	result
45	  7
125	 229
I/O例説明
I/O例#1
答えは次のとおりです.
n (10진법)	n (3진법)	앞뒤 반전(3진법)	10진법으로 표현
  45		1200		0021			7
したがって、7を返さなければなりません.
I/O例#2
答えは次のとおりです.
n (10진법)	n (3진법)	앞뒤 반전(3진법)	10진법으로 표현
125				11122	  22111			229
したがって、229に戻る必要があります.
function solution(n) {
    n = n.toString(3)
         .split("")
         .reverse()
         .join("")
    console.log(n)
    return parseInt( n, 3)
}
0と1からなる任意の文字列xに対して、次のバイナリ形式のコピーを定義します.
x上のすべての0を削除します.
xの長さがcの場合、xを「バイナリ文字列」に置き換えます.
例えば、x=「011010」の場合、xをバイナリ変換すると、x=「011010」->「1111」->「100」となる.
パラメータが0と1の文字列s.sが「1」になるまでsをバイナリ変換し続け、バイナリ変換の回数と変換中に削除されたすべての0の個数を配列に入れて返します.
せいげんじょうけん
sの長さは1または15万以下である.
sは少なくとも1つの「1」を含む.
I/O例
	s			result
"110010101001"	[3,8]
"01110"			[3,3]
"1111111"		[4,1]
입출력 예 설명
I/O例#1
110010101001が1になるまでバイナリ変換を実行します.
バイナリ変換前に削除する0個の数、0個の長さゼロの変換結果を削除
1	"110010101001"	6	6	"110"
2		"110"	    1	2	"10"
3		"10"	    1	1	"1"
3回のバイナリ変換で8個の0が削除されたため、[3,8]を返さなければなりません.
I/O例#2
「01110」が「1」になるまでバイナリ変換を実行します.
バイナリ変換前に削除する0個の数、0個の長さゼロの変換結果を削除
1	"01110"	2	3	"11"
2	"11"	0	2	"10"
3	"10"	1	1	"1"
3回のバイナリ変換中に3つの0が削除されたため、[3,3]を返さなければならない.
I/O例#3
111111が1になる前に、次のバイナリ変換を行います.
バイナリ変換前に削除する0個の数、0個の長さゼロの変換結果を削除
1	"1111111"	0	7	"111"
2	"111"	0	3	"11"
3	"11"	0	2	"10"
4	"10"	1	1	"1"
4回のバイナリ変換で0が1つ削除されたため、[4,1]を返さなければなりません.
function solution(s) {
let count=0/合計試行回数
削除let remove=0/0の合計
    
    //s가 "1"이 되지 않을 때까지, ("1"이 되면 중단)
    while( s !== "1" ){
        count++
        //"1"만 담는 변수
        let temp = ""
        //"0"을 제거하는 반복문
        for(let i = 0; i < s.length; i++){
            if( s[i] === "0"){
                //"0"을 발견했다면, temp 변수에 "0"을 넣지 않는다.
                remove++
                continue
            }
            //temp 에는 "1"만 담는다.
            temp += s[i]
        }
        s = temp.length
        // s를 2진법으로 변환한 데이터의 결과가 "1"이라면 반복문이 종료
        s = s.toString(2)
        //console.log(s, count, remove, temp)
    }
    //console.log(count, remove)
    return [count, remove]
  }

別の解釈

function solution(s) {
    let [count, remove] = [0, 0]
    
    function recursion(){
        if( s === "1" ){
            return [count, remove]
        }
        // 0을 제거
        remove += s.split("").filter(el => el === "0").length
        // 0이 제거된 1만 남은 문자열의 길이값을 2진법으로 변환
        s = s.split("").filter(el => el === "1").length
        s = s.toString( 2 )
        //console.log(s, remove)
        count++
        return recursion()
    }
    return recursion()
}