535. Encode and Decode TinyURL

題目

https://leetcode.com/problems/encode-and-decode-tinyurl/

Note: This is a companion problem to the System Design problem: Design TinyURL.
TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/design-tinyurl and it returns a short URL such as http://tinyurl.com/4e9iAk.

Design the encode and decode methods for the TinyURL service. There is no restriction on how your encode/decode algorithm should work. You just need to ensure that a URL can be encoded to a tiny URL and the tiny URL can be decoded to the original URL.

解答

這道題是讓我們設計一個短url的編碼方式。

其實可以簡單粗暴:

public List<String> data = new ArrayList<>();

public String encode(String longUrl) {
    int id = data.size();
    data.add(longUrl);

    return id + "";
}

// Decodes a shortened URL to its original URL.
public String decode(String shortUrl) {
    int id = Integer.valueOf(shortUrl);
    return data.get(id);
}

不過這樣不就沒有符合出題人的意圖了嘛,我搜了一下如何shorter url,發現原來是個進制轉換的過程。
https://stackoverflow.com/questions/742013/how-do-i-create-a-url-shortener

然後我就嘗試寫了一下,stackoverflow上寫的是62進制,其實你只要設計一個字母表,可以是任意進制的

public List<String> data = new ArrayList<>();

// Encodes a URL to a shortened URL.
public String encode(String longUrl) {
    int id = data.size();
    data.add(longUrl);
    return convert(id);
}

// Decodes a shortened URL to its original URL.
public String decode(String shortUrl) {
    return data.get(convert(shortUrl));
}

// 字母表,隨便設計,只要字符不重複就可以
public static final String alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*_+-=~`";

public static String convert(int number) {
    if (number == 0) {
        return alphabet.charAt(0) + "";
    }
    StringBuilder sb = new StringBuilder();
    while (number > 0) {
        sb.append(alphabet.charAt(number % alphabet.length()));
        number /= alphabet.length();
    }
    return sb.reverse().toString();
}

public static int convert(String code) {
    int num = 0;
    for (int i = 0; i < code.length(); i++) {
        num += alphabet.indexOf(code.charAt(i)) * Math.pow(alphabet.length(), code.length() - i - 1);
    }
    return num;
}

// 這裏是測試代碼
public static void main(String[] args) {
    for (int i = 0; i < 10000; i++) {
        String code = convert(i);
        System.out.println("num=" + i + " code=" + code + " back=" + convert(code));
    }
}

爲了驗證我寫的進制轉換方法是正確的,我寫了個測試方法來檢測看對不對。看起來是對的。

num=0 code=a back=0
num=1 code=b back=1
num=2 code=c back=2
num=3 code=d back=3
num=4 code=e back=4
num=5 code=f back=5
num=6 code=g back=6
num=7 code=h back=7
num=8 code=i back=8
num=9 code=j back=9
num=10 code=k back=10
num=11 code=l back=11
num=12 code=m back=12
num=13 code=n back=13
num=14 code=o back=14
num=15 code=p back=15
num=16 code=q back=16
num=17 code=r back=17
num=18 code=s back=18
num=19 code=t back=19
num=20 code=u back=20
num=21 code=v back=21
num=22 code=w back=22
num=23 code=x back=23
num=24 code=y back=24
num=25 code=z back=25
num=26 code=A back=26
num=27 code=B back=27
num=28 code=C back=28
num=29 code=D back=29
num=30 code=E back=30
num=31 code=F back=31
num=32 code=G back=32
num=33 code=H back=33
num=34 code=I back=34
num=35 code=J back=35
num=36 code=K back=36
num=37 code=L back=37
num=38 code=M back=38
num=39 code=N back=39
num=40 code=O back=40
num=41 code=P back=41
num=42 code=Q back=42
num=43 code=R back=43
num=44 code=S back=44
num=45 code=T back=45
num=46 code=U back=46
num=47 code=V back=47
num=48 code=W back=48
num=49 code=X back=49
num=50 code=Y back=50
num=51 code=Z back=51
num=52 code=0 back=52
num=53 code=1 back=53
num=54 code=2 back=54
num=55 code=3 back=55
num=56 code=4 back=56
num=57 code=5 back=57
num=58 code=6 back=58
num=59 code=7 back=59
num=60 code=8 back=60
num=61 code=9 back=61
num=62 code=! back=62
num=63 code=@ back=63
num=64 code=# back=64
num=65 code=$ back=65
num=66 code=% back=66
num=67 code=^ back=67
num=68 code=& back=68
num=69 code=* back=69
num=70 code=_ back=70
num=71 code=+ back=71
num=72 code=- back=72
num=73 code== back=73
num=74 code=~ back=74
num=75 code=` back=75
num=76 code=ba back=76
num=77 code=bb back=77
num=78 code=bc back=78
num=79 code=bd back=79
num=80 code=be back=80
num=81 code=bf back=81
num=82 code=bg back=82
num=83 code=bh back=83
num=84 code=bi back=84
num=85 code=bj back=85
num=86 code=bk back=86
num=87 code=bl back=87
num=88 code=bm back=88
num=89 code=bn back=89
num=90 code=bo back=90
num=91 code=bp back=91
num=92 code=bq back=92
num=93 code=br back=93
num=94 code=bs back=94
num=95 code=bt back=95
num=96 code=bu back=96
num=97 code=bv back=97
num=98 code=bw back=98
num=99 code=bx back=99
num=100 code=by back=100
num=101 code=bz back=101
num=102 code=bA back=102
num=103 code=bB back=103
num=104 code=bC back=104
num=105 code=bD back=105
num=106 code=bE back=106
num=107 code=bF back=107
num=108 code=bG back=108
num=109 code=bH back=109
num=110 code=bI back=110
num=111 code=bJ back=111
num=112 code=bK back=112
num=113 code=bL back=113
num=114 code=bM back=114
num=115 code=bN back=115
num=116 code=bO back=116
num=117 code=bP back=117
num=118 code=bQ back=118
num=119 code=bR back=119
num=120 code=bS back=120
num=121 code=bT back=121
num=122 code=bU back=122
num=123 code=bV back=123
num=124 code=bW back=124
num=125 code=bX back=125
num=126 code=bY back=126
num=127 code=bZ back=127
num=128 code=b0 back=128
num=129 code=b1 back=129
num=130 code=b2 back=130
num=131 code=b3 back=131
num=132 code=b4 back=132
num=133 code=b5 back=133
num=134 code=b6 back=134
num=135 code=b7 back=135
num=136 code=b8 back=136
num=137 code=b9 back=137
num=138 code=b! back=138
num=139 code=b@ back=139
num=140 code=b# back=140
num=141 code=b$ back=141
num=142 code=b% back=142
num=143 code=b^ back=143
num=144 code=b& back=144
num=145 code=b* back=145
num=146 code=b_ back=146
num=147 code=b+ back=147
num=148 code=b- back=148
num=149 code=b= back=149
num=150 code=b~ back=150
num=151 code=b` back=151
num=152 code=ca back=152
num=153 code=cb back=153
num=154 code=cc back=154
num=155 code=cd back=155
num=156 code=ce back=156
num=157 code=cf back=157
num=158 code=cg back=158
num=159 code=ch back=159
num=160 code=ci back=160
num=161 code=cj back=161
num=162 code=ck back=162
num=163 code=cl back=163
num=164 code=cm back=164
num=165 code=cn back=165
num=166 code=co back=166
num=167 code=cp back=167
num=168 code=cq back=168
num=169 code=cr back=169
num=170 code=cs back=170
num=171 code=ct back=171
num=172 code=cu back=172
num=173 code=cv back=173
num=174 code=cw back=174
num=175 code=cx back=175
num=176 code=cy back=176
num=177 code=cz back=177
num=178 code=cA back=178
num=179 code=cB back=179
num=180 code=cC back=180
num=181 code=cD back=181
num=182 code=cE back=182
num=183 code=cF back=183
num=184 code=cG back=184
num=185 code=cH back=185
num=186 code=cI back=186
num=187 code=cJ back=187
num=188 code=cK back=188
num=189 code=cL back=189
num=190 code=cM back=190
num=191 code=cN back=191
num=192 code=cO back=192
num=193 code=cP back=193
num=194 code=cQ back=194
num=195 code=cR back=195
num=196 code=cS back=196
num=197 code=cT back=197
num=198 code=cU back=198
num=199 code=cV back=199
num=200 code=cW back=200
num=201 code=cX back=201
num=202 code=cY back=202
num=203 code=cZ back=203
num=204 code=c0 back=204
num=205 code=c1 back=205
num=206 code=c2 back=206
num=207 code=c3 back=207
num=208 code=c4 back=208
num=209 code=c5 back=209
num=210 code=c6 back=210
num=211 code=c7 back=211
num=212 code=c8 back=212

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章