iT邦幫忙

0

請以C# 語法設計一個公用GetNumString方法,依傳入參數回傳數字字串

Joe 2018-12-14 10:27:053543 瀏覽

以下為經典面試題:

請各位大神協助,謝謝~

GetNumString(6) 回傳 “0123456”
GetNumString(15) 回傳 “0123456789012345”
GetNumString(23) 回傳 “012345678901234567890123”

看更多先前的討論...收起先前的討論...
攻城屍 iT邦新手 4 級 ‧ 2018-12-14 10:32:04 檢舉
自己的作業自己寫
Joe iT邦新手 3 級 ‧ 2018-12-14 10:51:56 檢舉
class Program
{
static void Main(string[] args)
{
Console.Write("Please Input A Number:");

Console.Write("Digital Change:" + GetNumString(Convert.ToInt32(Console.ReadLine())));

Console.ReadKey();
}

public static string GetNumString(int num)
{
int count = 0;
int newNum = 0;
int rNewNum = num;
string strNum = "";

if (num == 0)
{
return "0";
}
else
{
if (num % 10 == 0)
{
rNewNum = 0;
}

if (num > 10 && num < 20)
{
rNewNum -= 10;
}

if (num > 20)
{
rNewNum -= 20;
}

return GetNumString(num - 1) + rNewNum;
}
}
}

基本上已經完成,不過應該有比這更好的寫法,請問你有嗎???
...
如果我是面試官。我會先直接打槍就是了。會有很多人都被你這一段給誤解處理方式了。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
7
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2018-12-14 13:45:44
最佳解答

我怎麼覺得這沒什麼難度。而且不需要太複雜吧。
我獻醜一下好了。雖然是用php的寫法。但其實都可以在所有程式上應用才對


<?php
echo GetNumString(10);//01234567890

function GetNumString($n){
        $str = '';
        for($i=0;$i<=$n;$i++){
            $str .= $i%10;
        }
        return $str;
}
?>

不過其實題目有點陷阱就是了,如果有發現到的人,就很不錯了。
不知道有沒有人注意到了。上面有人說到了,但解釋的不太對。

看更多先前的回應...收起先前的回應...
Joe iT邦新手 3 級 ‧ 2018-12-14 15:28:14 檢舉

沒想到可以這麼精簡!!!/images/emoticon/emoticon16.gif

哈,是我嗎?
餘數部分我的解釋的確不太對
+1 是想讓下面的 for 多繞一位
餘 0 還是要進迴圈取出 0

大大的程式直指核心,一眼就可以看出重點
/images/emoticon/emoticon37.gif

froce iT邦大師 1 級 ‧ 2018-12-14 17:32:59 檢舉

星空大的是最標準的解法,應該所有語言都能這樣寫。
其他語言的版本要多個類型轉換就是了。

其實~~~因為工作上的特殊需要。很常需要取尾數的作業處理。
所以突然一看就知道怎麼解了。

而且這個問題,我也有出給類似的考題。
所以非常了解這樣的東西。

這其實是在考思考邏輯,不是在考程式能力。
不過依照我面試很多人寫出來的東西,的確是很多人沒辦法一針見血的寫出來。或是想秀自已的程式能力寫的很多。

Joe iT邦新手 3 級 ‧ 2018-12-17 11:03:41 檢舉

借花獻佛~

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;
        }
1
IT@lantis
iT邦新手 5 級 ‧ 2018-12-14 10:50:57
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;
    }
看更多先前的回應...收起先前的回應...
Joe iT邦新手 3 級 ‧ 2018-12-14 10:53:42 檢舉

挖~看起來好深奧~謝謝!!!

IT@lantis iT邦新手 5 級 ‧ 2018-12-14 10:56:04 檢舉

這邊偷懶array已經打印出來,可以在掛一層去跑0~9

IT@lantis iT邦新手 5 級 ‧ 2018-12-14 11:00:44 檢舉
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;
}
Joe iT邦新手 3 級 ‧ 2018-12-14 11:08:12 檢舉

這是我第二次的寫法,一樣有用到迴圈,不過看起來很髒,你寫的看起來專業度頗高

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分再說。

3
小碼農米爾
iT邦高手 1 級 ‧ 2018-12-14 11:58: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();
}

測試

Joe iT邦新手 3 級 ‧ 2018-12-14 13:05:59 檢舉

謝謝~/images/emoticon/emoticon34.gif

古人說:字如其人,果然不假
從程式碼就可以看出大大是正直不阿之人
即使用 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);
	}
}

不喜歡有重複的地方
/images/emoticon/emoticon25.gif

這個版本也太偷機取巧了

4
海綿寶寶
iT邦大神 1 級 ‧ 2018-12-14 12:08:19

吃飽太閒,獻醜一下

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。

froce iT邦大師 1 級 ‧ 2018-12-14 13:00:26 檢舉

因為實在不太經典,所以亂入一下python寫法好了。

def GetNumString(num):
	return "".join(str(i)[-1] for i in range(num+1))
Joe iT邦新手 3 級 ‧ 2018-12-14 13:12:31 檢舉

經典是見仁見智囉~不過可以吊出這麼多的高手,也算是經典了/images/emoticon/emoticon32.gif

froce iT邦大師 1 級 ‧ 2018-12-14 13:14:08 檢舉

順便用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('')
2
小魚
iT邦大師 1 級 ‧ 2018-12-14 13:16:36

我玩一下遞迴吧

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);

上面三個數字都測試過.

2
暐翰
iT邦大師 1 級 ‧ 2018-12-14 14:20:26

寫一個不一樣C#解法,一行搞定版本:

static string GetNumString(int num)=> string.Join("",Enumerable.Range(0,num+1).Select(s=>s%10));

2018-12-14.14.23.48-image.png

看更多先前的回應...收起先前的回應...
Homura iT邦高手 1 級 ‧ 2018-12-14 14:26:38 檢舉

IT邦幫你跳行了/images/emoticon/emoticon39.gif

暐翰 iT邦大師 1 級 ‧ 2018-12-14 14:27:52 檢舉

哈哈 /images/emoticon/emoticon37.gif

我想過可以把陣列丟到 Linq,原來還有 Enumerable.Range 可以用。
/images/emoticon/emoticon01.gif ((筆記

暐翰 iT邦大師 1 級 ‧ 2018-12-14 14:57:28 檢舉

Enumerable.Range跟Enumerable.Repeat很好用的方法

Joe iT邦新手 3 級 ‧ 2018-12-14 15:33:44 檢舉

/images/emoticon/emoticon42.gif

froce iT邦大師 1 級 ‧ 2018-12-14 16:19:26 檢舉

其實我幹嘛亂入python的一行版本就是想看C#的一行版。終於釣到了。

暐翰 iT邦大師 1 級 ‧ 2018-12-14 16:23:11 檢舉

froce python還是比較少代碼 /images/emoticon/emoticon12.gif

Luke iT邦研究生 5 級 ‧ 2018-12-14 16:25:47 檢舉

/images/emoticon/emoticon42.gif

1
一級屠豬士
iT邦新手 2 級 ‧ 2018-12-14 19:50:06
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

0
evali9876
iT邦新手 5 級 ‧ 2018-12-17 09:30:10

弱弱的練習..../images/emoticon/emoticon37.gif

    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;
    }
Joe iT邦新手 3 級 ‧ 2018-12-17 09:32:38 檢舉

/images/emoticon/emoticon37.gif

我要發表回答

立即登入回答