## Wednesday, January 6, 2021

### Leetcode discuss: 273. Integer to English Words

##### First practice - C# - Check list - Take more than one hour

Dec. 30, 2020
Introduction
I came cross the algorithm in Leetcode premium Facebook mock onsite, last algorithm in 4. I spent over 35 minutes but I could not finish it.

Check list
I worked on coding using Visual studio, make sure that the code works for "123", "123456", "1234567890".

Here are the check list to record my learning:

1. Design digts, secondDigit, teens array, every thing should start from index 0 to 9 to match digit 0 to 9, easy to call.
2. More on item 1, I added "Zero" into digits, secondDigit, missing Eighteen in teens array;
3. Failed test case 0, add code to return "Zero";
4. Work on space to separate word; Call C# string.TrimEnd, assign to a variable before return;
5. Failed edge case "millon thousand", so I added the array called zeroChecking;
6. I tried to make the code easy to write, so I design a while loop using repeat, for million three digits, thousand three digits, rightmost three digits.
7. The integer is converted to a C# List, so it is always to work on first char in the list, since List.RemoveAt is called after each visit.
8. Logic of length > 8 meaning length at least 9, which should not be length >= 8.
9. Ideas to improve - I need to think about ideas to code in less than 20 minutes.
``````public class Solution {
public string NumberToWords(int num) {
var chars = num.ToString().ToCharArray();
var expr = new StringBuilder();
var digits = new string[] {"Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine" };
var secondDigit = new string[] {"Zero","Ten","Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" };
var teens = new string[] { "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen","Nineteen" };

var length = chars.Length;

if(num == 0)
return "Zero";

var list = new List<char>(chars);

if (length > 9)
{
var digit = list[0] - '0';
if (digit >= 1)
{
expr.Append(digits[digit] + " Billion ");
}

list.RemoveAt(0);
}

int repeat = 0;
var zeroChecking = new int[3];

while (repeat < 3)
{
if ((repeat == 0 && length > 8) ||
(repeat == 1 && length > 5) ||
(repeat == 2 && length > 2)
)
{
var digit = list[0] - '0';
if (digit >= 1)
{
expr.Append(digits[digit] + " Hundred ");
zeroChecking[repeat] = 1;
}

list.RemoveAt(0);
}

var isTeen = false;
if ((repeat == 0 && length > 7) ||
(repeat == 1 && length > 4) ||
(repeat == 2 && length > 1))
{
var digit = list[0] - '0';
if (digit > 1)
{
expr.Append(secondDigit[digit] + " ");
zeroChecking[repeat] = 1;
}
else if (digit == 1)
{
// expr.Append(secondDigit[digit]);
isTeen = true;
zeroChecking[repeat] = 1;
}

list.RemoveAt(0);
}

if ((repeat == 0 && length > 6) ||
(repeat == 1 && length > 3) ||
(repeat == 2 && length >= 0))
{
var digit = list[0] - '0';
if(digit > 0)
{
zeroChecking[repeat] = 1;
}

if (isTeen)
{
expr.Append(teens[digit] + " ");
}
else if (digit > 0)
{
expr.Append(digits[digit] + " ");
}

list.RemoveAt(0);
}

if (repeat == 0 && length > 6)
{
if(zeroChecking[repeat] > 0)
expr.Append("Million ");
}
else if (repeat == 1 && length > 3)
{
if(zeroChecking[repeat] > 0)
expr.Append("Thousand ");
}

repeat++;
}

var trimed = expr.ToString().TrimEnd();
return trimed;
}
}``````