0
0

表記の訂正 (paizaランク C 相当)

Posted at

・ ミス 1
先頭に必要のない 0 がいくつかついてしまう
・ 本来 1 である数値が 0001 と表記されてしまう
・ 本来 0.001 である数値が 00.001 と表記されてしまう

・ ミス 2
小数である数値の末尾に必要のない 0 がいくつかついてしまう
・ 本来 0.1 である数値が 0.10 と表記されてしまう

・ ミス 3
小数である数値に小数点が複数個ついてしまう
ただし、 1 つめの小数点の位置が正しい小数点の位置であるものとします
・ 本来 0.123 である数値が 0.1.2.3 と表記されてしまう。

表記が正しくない可能性のある数値を表す文字列 S が与えられるので、その数値を正しい表記にしてください。
S を数値として扱うと上手く処理が行えないので気をつけてください。

はい。すっげえ難しく30分過ぎてもできなかったのでギブアップ。

ひとまず考えとして
・小数か整数かで場合分け
・整数なら、正規表現で先頭の000だけ消せばいけるんでは
・小数なら、まず集合を用意して、0と.だけ登録してもし集合にあればスキップして、1-9がでてきたら抜ければいいんでは
=>サンプル3で、0はそもそも、一番最後だけで、途中にあってもよいのでここで詰まる。

def istype(S):
    #小数なら1 整数なら0のまま
    flag = 0
    for i in S:
         if i == '.':
            flag = 1
            break   
    return flag

#小数点がある場合の処理
def process_for_miss1(S):
    tmp =set()
    ans = []
    for i in S:
        if '.' in tmp:
            if i != '0':
                ans.append(i)
                break
            else:
                ans.append(i)
        if i == '0' or i == '.':
            if  i not in tmp:
                tmp.add(i)
                ans.append(i)
        else:
            ans.append(i)
    return ans
    
def process_for_miss2(S):
    import re
    pattern = '\b0+'
    result = re.sub(pattern,"",S)
    return result

S = input()
decimal_type = istype(S)
#フラグが0なら整数の処理、1なら小数の処理
if decimal_type == 0:
    ans = process_for_miss2(S)
    print(ans)
else:
    ans = process_for_miss1(S)
    print("".join(ans))

答えを見るとこんな感じ。
とりあえず考え方を#で書いてます。

s = input()

#小数点があるかで分岐
if "." not in s:
    #整数
    i = 0
    #文字数を桁と捉えて左から順番にループしていく
    #s[i]が0でなくなるまでループ
    while i < len(s):
        if s[i] != "0":
            break
        i += 1
    #もしiが最後の桁までいったら、0でOK,もし途中だったらそこから最後まで出力
    if i == len(s):
        print(0)
    else:
        print(s[i:])
else:
    #小数
    ans = ""
    start = 0

    for i in range(len(s)):
        #整数と同じ考え方でループ
        #0でなくなっただけなら、そこから出力開始と考える
        #0でなく.だったら、0をつける
        if s[i] != "0":
            if s[i] == ".":
                ans += "0"
            #開始位置を更新
            start = i
            break
            
    #終了位置を考える
    last = 0
    for i in range(len(s)):
        #ここで最後に0以外になったら更新、0だったら未更新でそのまま終わりになる
        #読み飛ばす位置がわかる
        if s[i] != "0":
            last = i
    #最初の小数点の位置を確認
    first_dot = s.find(".")
    #開始位置〜終了位置までループ
    for i in range(start, last + 1):
        #小数点でなければ出力
        if s[i] != ".":
            ans += s[i]
        #first_dotの位置であれば出力
        elif i == first_dot:
            ans += s[i]

    print(ans)

なるほど〜〜〜〜〜
なかなか難しかったです。
数値で考えたからかな。。。。
とはいえこの書き方は思いつかなかったので、勉強です。

で、小数点がふくまれていなければ、int()を使って
print(int(S))で先頭の0が含まれない形になるのでこれも覚えておきたいところ。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0