网上看到类似的算法,不过实现是C++.
private static void alphaseq0(int n, String alphabet, StringBuffer buf) {
int len = alphabet.length();
if (n >= len) {
alphaseq0(n/len - 1,alphabet,buf);
n = n % len;
}
buf.append(alphabet.charAt(n));
}
本题的题意是: 给定一个 整数 n
和 字元集 alphabet
,return 一个对应的 string
而 对应的规则 如下:
(假设我们的字元集是英文字母 A-Z,也就是说这些字元是可以用来代表给定的整数的)
1 -> A
2 -> B
3 -> C
...
26 -> Z
27 -> AA
...
52 -> AZ
...
m -> ZZA
...
n -> ZZZ
n+1 -> AAAA
Soalan ini nampak mudah pada pandangan pertama, tetapi sebenarnya saya mengambil banyak masa untuk mengkajinya dengan teliti (mungkin saya berfikiran sederhana...)
Maksud soalan ini ialah: diberi integer dan set aksara, kembalikan rentetan
yang sepadandan peraturan yang sepadan untuk adalah seperti berikut:
Saya serta-merta memikirkan
Jika bilangan perubahan dalamitertools.product
Saya boleh menjana rentetan yang mencukupi dan memilihn
yang:alphabet
tidak mencukupi,return None
Jadi jika saya ingin mendapatkan rentetan yang sepadan dengan
n=3000
;Tetapi masalahnya ialah: ia sangat memakan masa, atas sebab mudah saya menjana terlalu banyak barangan yang tidak perlu. Membandingkan contoh C yang diberikan oleh poster, saya harus terus menjana rentetan yang sepadan
Jadi apa yang perlu kita lakukan? Saya terfikir untuk membawa penukaran Bukankah masalah ini membawa kepada penukaran?
Sebagai contoh, mari lihat contoh menukar perpuluhan kepada perenambelasan:
Mengambil 31 sebagai contoh, mula-mula kita bahagikan 16 sekali untuk mendapatkan baki 15, kemudian kita boleh mengetahui simbol pertamanya
F
, dan kemudian bahagikannya untuk kali kedua untuk mendapatkan baki1
dan kita juga boleh ketahui simbol keduanya Simbol bit1
.Bukankah masalah penukaran semasa kami yang sepadan: memerlukan penukaran perpuluhan (10 simbol 0-9) kepada perenambelasan (26 simbol A-Z)?
Itu tidak mudah mengikut kaedah penukaran bawa, saya hanya perlu terus membahagikan panjang set aksara
len(alphabet)
(len(alphabet)
bawa) untuk menanyakan simbol yang sepadan bagi setiap bit.Malangnya, masalahnya tidak semudah itu. Adakah anda perasan? Surat-menyurat ini akan bermula dari 1 dan bukannya 0. Tanpa surat-menyurat 0, semua peraturan nampaknya banyak terganggu digit perpuluhan
26
sepatutnya dibawa, tetapi ia bukan di sini26
sepadan dengan satu simbolZ
Kita mesti mengetahui peraturan untuk mengendalikan situasi bahagi dengan 26 dan meninggalkan 0.Jadi saya mula mematuhi peraturan:
Kami akan dapati:
Jika ia bukan integer boleh bahagi (bakinya bukan sifar), maka peraturannya adalah sama dengan penukaran bit Anda boleh terus menggunakan baki untuk menanyakan simbol yang sepadan, dan menggunakan
商
sebagai dividen untuk melakukan bahagian seterusnyaJika ia adalah bahagian integer (baki sifar), kita mesti mengambil tanda terakhir, dan bahagian seterusnya mesti menggunakan
(商-1)
sebagai dividen untuk bahagian seterusnyaMengikut peraturan ini, saya menulis dua versi fungsi Satu ialah menggunakan rekursif seperti kod sampel C :
Cara lain ialah menggunakan iterate:
Selagi rentetan yang ditukar oleh ketiga-tiga fungsi ini dibandingkan, ketepatannya boleh disahkan.
Jika poster menemui sesuatu yang berbeza daripada soalan asal yang dikehendaki atau jika anda mempunyai sebarang ulasan, sila beritahu saya dalam ulasan!
Soalan yang saya jawab: Python-QA