背景
最近找工作的人太多了,在看面试题,时刻准备好Run,这是我碰到的一道面试题,在面试的过程中,我实现了个大概,面完之后我想要实现一个更完美的版本,我求助了下ChatGpt(不想动脑),以下是我的一些求助过程。
题目
实现一个函数,输入阿拉伯数字转换成中文汉字返回
我的指令过程
- 第一次询问
嗯,是我没说清楚,我其实想要js实现的版本
- 第二次询问
实现代码如下:
function num2cn(number) {
// 定义中文数字字符
const cn_nums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
// 定义中文数字单位
const cn_units = ['', '十', '百', '千', '万', '亿'];
// 将数字转换为字符串并逆序
const str_num = number.toString().split('').reverse().join('');
// 初始化中文数字字符串
let cn_str = '';
// 遍历数字字符串
for (let i = 0; i < str_num.length; i++) {
// 将字符转换为数字
const num = parseInt(str_num.charAt(i));
// 如果当前数字是零并且不是第一位或万位或亿位
if (num === 0 && (i !== 0 && i % 4 !== 0)) {
// 如果中文数字字符串的最后一个字符不是零,则添加零
if (cn_str.charAt(cn_str.length - 1) !== cn_nums[0]) {
cn_str += cn_nums[0];
}
}
// 如果当前数字不是零
else {
// 添加中文数字字符
cn_str += cn_nums[num];
// 如果当前数字不是个位数,添加中文数字单位
if (i !== 0) {
cn_str += cn_units[i % 4];
}
// 如果当前数字是万位或亿位,添加中文数字单位
if (i % 4 === 0 && i !== 0) {
cn_str += cn_units[i % 4 + 1];
}
}
}
// 将中文数字字符串反转并返回
return cn_str.split('').reverse().join('');
}
我随便输入了个数字进行测试,发现结果是有问题的
- 第三次询问
实现代码如下:
function num2cn(number) {
// 定义中文数字字符
const cn_nums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
// 定义中文数字单位
const cn_units = ['', '十', '百', '千', '万', '亿'];
// 将数字转换为字符串并逆序
const str_num = number.toString().split('').reverse().join('');
// 初始化中文数字字符串
let cn_str = '';
// 记录当前数字是否为零
let is_zero = true;
// 遍历数字字符串
for (let i = 0; i < str_num.length; i++) {
// 将字符转换为数字
const num = parseInt(str_num.charAt(i));
// 如果当前数字是零
if (num === 0) {
// 如果不是万位或亿位
if (i % 4 !== 0) {
// 如果前一个数字不是零,则添加零
if (!is_zero) {
cn_str += cn_nums[0];
}
is_zero = true;
}
// 如果是万位或亿位
else {
// 添加中文数字单位
cn_str += cn_units[i % 4 + 1];
is_zero = true;
}
}
// 如果当前数字不是零
else {
// 添加中文数字字符
cn_str += cn_nums[num];
// 如果不是个位数,添加中文数字单位
if (i !== 0) {
cn_str += cn_units[i % 4];
}
is_zero = false;
}
}
// 如果中文数字字符串以零结尾,则去掉零
if (cn_str.charAt(cn_str.length - 1) === cn_nums[0]) {
cn_str = cn_str.slice(0, -1);
}
// 将中文数字字符串反转并返回
return cn_str.split('').reverse().join('');
}
- 第四次询问
function num2cn(number) {
// 定义中文数字字符
const cn_nums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
// 定义中文数字单位
const cn_units = ['', '十', '百', '千', '万', '亿'];
// 将数字转换为字符串并逆序
const str_num = number.toString().split('').reverse().join('');
// 初始化中文数字字符串
let cn_str = '';
// 记录当前数字是否为零
let is_zero = true;
// 记录是否需要添加万或亿
let need_add_unit = false;
// 遍历数字字符串
for (let i = 0; i < str_num.length; i++) {
// 将字符转换为数字
const num = parseInt(str_num.charAt(i));
// 如果当前数字是零
if (num === 0) {
// 如果是万位或亿位
if (i % 4 === 0) {
need_add_unit = true;
}
// 如果不是万位或亿位,且前一个数字不是零
else if (!is_zero) {
cn_str = cn_nums[0] + cn_str;
is_zero = true;
}
}
// 如果当前数字不是零
else {
// 添加中文数字字符和中文数字单位
cn_str = cn_nums[num] + cn_units[i % 4] + cn_str;
is_zero = false;
// 如果是万位或亿位,需要添加中文数字单位
if (i % 4 === 0) {
cn_str = cn_units[4 + Math.floor(i / 4)] + cn_str;
need_add_unit = false;
}
}
}
// 如果中文数字字符串以零结尾,则去掉零
if (cn_str.charAt(cn_str.length - 1) === cn_nums[0]) {
cn_str = cn_str.slice(0, -1);
}
// 如果需要添加万或亿,则在最前面添加中文数字单位
if (need_add_unit) {
cn_str = cn_units[4 + Math.floor(str_num.length / 4)] + cn_str;
}
return cn_str;
}
我测试了一下依旧不行,但其实我没怎么看实现逻辑,我单纯想要当一个伸手党。
- 第五次询问
function num2cn(number) {
// 定义中文数字字符
const cn_nums = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
// 定义中文数字单位
const cn_units = ['', '十', '百', '千', '万', '亿'];
// 将数字转换为字符串并逆序
const str_num = number.toString().split('').reverse().join('');
// 初始化中文数字字符串
let cn_str = '';
// 记录当前数字是否为零
let is_zero = true;
// 记录是否需要添加万或亿
let need_add_unit = false;
// 遍历数字字符串
for (let i = 0; i < str_num.length; i++) {
// 将字符转换为数字
const num = parseInt(str_num.charAt(i));
// 如果当前数字是零
if (num === 0) {
// 如果是万位或亿位
if (i % 4 === 0 && i !== 0) {
need_add_unit = true;
}
// 如果不是万位或亿位,且前一个数字不是零
else if (!is_zero) {
cn_str = cn_nums[0] + cn_str;
is_zero = true;
}
}
// 如果当前数字不是零
else {
// 添加中文数字字符和中文数字单位
cn_str = cn_nums[num] + cn_units[i % 4] + cn_str;
is_zero = false;
// 如果是万位或亿位,需要添加中文数字单位
if (i % 4 === 0 && i !== 0) {
cn_str = cn_units[4 + Math.floor(i / 4)] + cn_str;
need_add_unit = false;
}
}
}
// 如果中文数字字符串以零结尾,则去掉零
if (cn_str.charAt(cn_str.length - 1) === cn_nums[0]) {
cn_str = cn_str.slice(0, -1);
}
// 如果需要添加万或亿,则在最前面添加中文数字单位
if (need_add_unit) {
cn_str = cn_units[4 + Math.floor((str_num.length - 1) / 4)] + cn_str;
}
// 如果数字为100000000,则特殊处理
if (number === 100000000) {
cn_str = '一亿';
}
return cn_str;
}
- 第六次询问,我开始不耐烦了
console.log(num2cn(0)); // 零
console.log(num2cn(10)); // 十
console.log(num2cn(20)); // 二十
console.log(num2cn(110)); // 一百一十
console.log(num2cn(302)); // 三百零二
console.log(num2cn(1002)); // 一千零二
console.log(num2cn(1012)); // 一千零一十二
console.log(num2cn(10020)); // 一万零二十
console.log(num2cn(12345)); // 一万二千三百四十五
console.log(num2cn(100000)); // 十万
console.log(num2cn(100001)); // 十万零一
console.log(num2cn(100100)); // 十万零一百
console.log(num2cn(102000)); // 十万零二千
console.log(num2cn(1000000)); // 一百万
console.log(num2cn(10010000)); // 一千零一十万
console.log(num2cn(100010000)); // 一千万零一万
console.log(num2cn(100000000)); // 一亿
我以为这次他写对了,但是再测一下还是错的
- 第七次询问
function num2cn(num) {
if (typeof num !== 'number') {
throw new Error('Input must be a number');
}
if (num < 0 || num >= 1e12) {
throw new Error('Input must be a non-negative integer less than 1e12');
}
if (num === 0) {
return '零';
}
const units = ['', '十', '百', '千'];
const digits = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
const bigUnits = ['', '万', '亿'];
let result = '';
let index = 0;
while (num > 0) {
let currentNum = num % 10000;
let currentStr = '';
if (currentNum === 0) {
currentStr = '零';
} else {
let count = 0;
while (currentNum > 0) {
let digit = currentNum % 10;
if (digit > 0) {
currentStr = digits[digit] + units[count] + currentStr;
} else {
// 当前位是 0 时需要特判,避免多个零连续出现
if (currentStr.charAt(0) !== '零') {
currentStr = digits[digit] + currentStr;
}
}
count++;
currentNum = Math.floor(currentNum / 10);
}
}
result = currentStr + bigUnits[index] + result;
index++;
num = Math.floor(num / 10000);
}
// 最后的 '一十' 转为 '十'
result = result.replace(/^一十/, '十');
return result;
}
- 第八次询问
是他累了么
结论
首先必须得肯定chatGpt带来的革命性突破,但这里也要提醒像我一样的伸手党,不要太依赖ChatGpt了,他出思路是很快,但是距离写完后能不能直接上生产的问题,我想他还有很大的距离。他的准确度没有达到100%,我们依旧需要花时间去验证他的思路已经实现是否百分百可靠。