以下為經典面試題:
請各位大神協助,謝謝~
GetNumString(6) 回傳 “0123456”
GetNumString(15) 回傳 “0123456789012345”
GetNumString(23) 回傳 “012345678901234567890123”
我怎麼覺得這沒什麼難度。而且不需要太複雜吧。
我獻醜一下好了。雖然是用php的寫法。但其實都可以在所有程式上應用才對
<?php
echo GetNumString(10);//01234567890
function GetNumString($n){
$str = '';
for($i=0;$i<=$n;$i++){
$str .= $i%10;
}
return $str;
}
?>
不過其實題目有點陷阱就是了,如果有發現到的人,就很不錯了。
不知道有沒有人注意到了。上面有人說到了,但解釋的不太對。
星空大的是最標準的解法,應該所有語言都能這樣寫。
其他語言的版本要多個類型轉換就是了。
其實~~~因為工作上的特殊需要。很常需要取尾數的作業處理。
所以突然一看就知道怎麼解了。
而且這個問題,我也有出給類似的考題。
所以非常了解這樣的東西。
這其實是在考思考邏輯,不是在考程式能力。
不過依照我面試很多人寫出來的東西,的確是很多人沒辦法一針見血的寫出來。或是想秀自已的程式能力寫的很多。
借花獻佛~
static void Main(string[] args)
{
string inputNum = "";
Regex NumberPattern = new Regex("^[0-9]*$");
Console.WriteLine("輸入值請輸入數字,輸入非數字則自動關閉。。。");
Console.WriteLine();
do
{
Console.Write("輸入值:");
inputNum = Console.ReadLine();
if (NumberPattern.IsMatch(inputNum))
{
GetNumString(Convert.ToInt32(inputNum));
Console.WriteLine(GetNumString(Convert.ToInt32(inputNum)));
Console.WriteLine();
}
} while (NumberPattern.IsMatch(inputNum));
}
private static string GetNumString(int num)
{
string outputVal = "";
for (int i = 0; i <= num; i++)
{
outputVal += i % 10;
}
return outputVal;
}
static string[] arr = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
void Main()
{
GetNumString(6).Dump(); // “0123456”
GetNumString(15).Dump();
GetNumString(23).Dump();
}
string GetNumString(int num)
{
var Result = string.Empty;
var counter = num;
var index = 0;
while (counter > 0)
{
if (index == 0)
{
Result += arr[index];
index++;
}
else
{
if (index >= arr.Length)
index = 0;
Result += arr[index++];
counter--;
}
}
return Result;
}
string GetNumString(int num)
{
var Result = string.Empty;
var counter = num;
int printNum = 0;
while (counter > 0)
{
if (printNum == 0)
{
Result += printNum;
printNum++;
}
else
{
if (printNum > 9)
printNum = 0;
Result += printNum++;
counter--;
}
}
return Result;
}
這是我第二次的寫法,一樣有用到迴圈,不過看起來很髒,你寫的看起來專業度頗高
public static string GetNumString(int num)
{
int count = 0;
int newNum = 0;
int rNewNum = num;
string strNum = "";
for (; count <= num; count++)
{
strNum += newNum.ToString();
newNum += 1;
if (newNum > 9)
{
newNum = 0;
}
}
while (count <= num)
{
strNum += newNum.ToString();
newNum += 1;
count++;
if (newNum > 9)
{
newNum = 0;
}
}
return strNum;
}
用了array啊,也算是一種另類的解法啦。
不過...........先扣30分再說。
public static string GetNumString(int num)
{
var result = new StringBuilder();
//商數
var quotient = num / 10;
for (var i = 0; i < quotient; i++)
{
result.Append("0123456789");
}
//餘數,加1是因為循環第一位是0
//更新說明:
//+1 是為了餘0還是要進迴圈取出0
var remainder = num % 10 + 1;
for (var i = 0; i < remainder; i++)
{
result.Append(i.ToString());
}
return result.ToString();
}
看到海綿寶寶的寫法,改用 Substring
public static string GetNumString(int num)
{
var template = "0123456789";
var result = new StringBuilder();
for (var i = 0; i < num / template.Length; i++)
{
result.Append(template);
}
result.Append(template.Substring(0, num % template.Length + 1));
return result.ToString();
}
謝謝~
古人說:字如其人,果然不假
從程式碼就可以看出大大是正直不阿之人
即使用 template 累加字串
也不多浪費一個字元
反觀在下就是個偷機取巧之人
以下是我另一個版本的程式碼
using System;
public class Program
{
public static void Main()
{
Console.WriteLine(GetNumString(6));
Console.WriteLine(GetNumString(15));
Console.WriteLine(GetNumString(23));
}
static string GetNumString(int num) {
var s = "012345678901234567890123";
return s.Substring(0, num+1);
}
}
不喜歡有重複的地方
這個版本也太偷機取巧了
吃飽太閒,獻醜一下
using System;
public class Program
{
public static void Main()
{
Console.WriteLine(GetNumString(6));
Console.WriteLine(GetNumString(15));
Console.WriteLine(GetNumString(23));
}
static string GetNumString(int num) {
var s = "0";
for (int i = 0; i <= num/10; i++)
{
s += "1234567890";
}
return s.Substring(0, num+1);
}
}
0123456
0123456789012345
012345678901234567890123
另外
這怎麼看都稱不上什麼「經典」題
哈,原來可以用 Substring。
因為實在不太經典,所以亂入一下python寫法好了。
def GetNumString(num):
return "".join(str(i)[-1] for i in range(num+1))
經典是見仁見智囉~不過可以吊出這麼多的高手,也算是經典了
順便用C#重寫想法
static string GetNumString(int num) {
var s = "";
for (int i = 0; i <= num; i++)
{
var tmp = i.ToString();
s += tmp[tmp.Length - 1];
}
return s;
}
這其實算是很經典的題目了。
主要目的要能馬上立即看出題目的本質在哪。
畢竟他也沒說不能使用函數。
但其實如果使用了函數一般就只剩下60分了。
這題目是有陷阱的。也順便是在考反應跟應用。
亂入 Javascript
const GetNumString = num => Array.call(0, num + 1).fill(0).map((v, i) => i % 10).join('')
我玩一下遞迴吧
static string GetNumString(int num, int total)
{
if (num <= 0)
return "";
else
return ((total - num) % 10).ToString() + GetNumString(num - 1, total);
}
但是我看你的定義比我多一個數字,
所以呼叫的時候要+1
int num = 23;
string text = GetNumString(num+1, num+1);
Console.WriteLine(text);
上面三個數字都測試過.
寫一個不一樣C#解法,一行搞定版本:
static string GetNumString(int num)=> string.Join("",Enumerable.Range(0,num+1).Select(s=>s%10));
IT邦幫你跳行了
哈哈
我想過可以把陣列丟到 Linq,原來還有 Enumerable.Range 可以用。
((筆記
Enumerable.Range跟Enumerable.Repeat很好用的方法
create or replace function ithelp181214(n integer)
returns text
as $$
with t1 as (
select (x % 10)::text as ch
from generate_series(0, n) as g(x)
)
select string_agg(ch, '')
from t1
;
$$
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
// -- test
with t1 as
(
select x
from generate_series(-2, 11) as g(x)
union all
select unnest(ARRAY[15, 23])
)
select x
, ithelp181214(x)
from t1;
x | ithelp181214
----+--------------------------
-2 | [null]
-1 | [null]
0 | 0
1 | 01
2 | 012
3 | 0123
4 | 01234
5 | 012345
6 | 0123456
7 | 01234567
8 | 012345678
9 | 0123456789
10 | 01234567890
11 | 012345678901
15 | 0123456789012345
23 | 012345678901234567890123
弱弱的練習....
protected string GetNumString(int Num)
{
string result = "";
/*example:
GetNumString(6) =0123456
GetNumString(15) =0123456789012345
GetNumString(23) =012345678901234567890123
*/
int i = Num / 10;
if (i>0)
{
for (int k = 0; k < i; k++)
{
result += "0123456789";
if (k == i - 1)
{
for (int j = 0; j <=( Num-(i*10)); j++)
{
result += j;
}
break;
}
}
}
else
{
for (int j = 0; j <=Num; j++)
{
result += j;
}
}
return result;
}