26日間のアルゴリズム
3411 ワード
パラメータは自然数nを与える.nを三進法で前後に逆さまにし、それを十進法で表す数で返し、解関数を完成させる.
せいげんじょうけん
nは10000000を超える自然数である.
I/O例
I/O例#1
答えは次のとおりです.
I/O例#2
答えは次のとおりです.
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例
110010101001が1になるまでバイナリ変換を実行します.
バイナリ変換前に削除する0個の数、0個の長さゼロの変換結果を削除
I/O例#2
「01110」が「1」になるまでバイナリ変換を実行します.
バイナリ変換前に削除する0個の数、0個の長さゼロの変換結果を削除
I/O例#3
111111が1になる前に、次のバイナリ変換を行います.
バイナリ変換前に削除する0個の数、0個の長さゼロの変換結果を削除
function solution(s) {
let count=0/合計試行回数
削除let remove=0/0の合計
せいげんじょうけん
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例#1110010101001が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()
}
Reference
この問題について(26日間のアルゴリズム), 我々は、より多くの情報をここで見つけました https://velog.io/@gusahr119/26일차-알고리즘テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol