前言
偶然看到一个简单的算法题,是一个千位分割的问题,就是比如输入12345678,输出12,345,678这种。听说这也是某个企业的面试题,闲来无事就着手实现一下。我先用了C++进行实现,后来换一种思路用了Python实现,最后采用了更为简单的正则表达式,并对负数、小数都加以实现。
C++实现
由于笔者是个菜鸡,平时很少编程,C++还是大一的时候学了点皮毛,现在基本忘了差不多了🌚,所以用的很不熟练,下面是我实现千位分割问题的代码,如果有可以改进的地方,欢迎指出😉。
1 |
using namespace std; int () { int num,len=0,extra,temp; int level=1; cout << "请输入一个数:"; cin >> num; temp = num; while(temp>0) { temp /=10; len++; level *=10; } extra = len%3; //超出3的倍数位的位数 //输出带有千位分隔符的数字 int k=0; while(len>0) { level /=10; cout << char(num/level+'0'); //输出每一位 num %= level; k++; extra--; len--; if((extra == 0 && len > 2) || (k == 3 && len >0)) { cout << ","; k = 0; } } } |
运行结果
Python实现
用C++实现这一简单的问题还是要费一点事的,所以我又转用Python进行了实现,这里我主要是把字符串转变为列表进行了处理。
1 |
num = input("请输入一个数:") |
运行结果
正则表达式实现
读者可能已经发现了,我上述代码的实现对输入的数都要求是正数、整数,要实现正数负数,小数整数都能使用的话,还是需要添加部分代码的,于是这里使用正则表达式来进行实现。
据说熟练掌握正则表达式可以节省上百行代码🤔,哈哈,由于这里的问题比较简单,不能充分体现出正则表达式的优势。而且Python的正则表达式引擎是用 C 语言写的,所以效率是十分高,并且几乎所有的字符串任务均可用正则表达式来实现,所以掌握正则表达式是十分有必要的,大家有时间可以去学习一波🤓。下面就贴出我的代码:
1 |
num = input("请输入一个数:") |
运行结果
可以发现,该程序对负数、小数都能实现千分位分割。正则表达式好处自然很明显,劣势就是不易读,如果不是很熟悉的话很难快速理解该表达式的意思,这里 (?<=d) 的意思是匹配项前面要有数字,而 (?=(d{3})+$) 的意思是匹配项后面到结束符要有3的倍数个数字,需要注意的是这里的匹配不消耗字符串的内容,所以原本用作替换的sub函数相当于实现了插入的功能。
后记
从上面不同方法的实现,可以看出正则表达式在处理字符串方面的优势,由此可见正则表达式是一个十分重要的技能。其实,像千位分割这种常见的操作,Python怎么会没有函数能够一步到位实现呢🤔?果然,查阅资料后发现,format函数就可以实现这一功能。
1 |
print(format(-123456789.12345,',')) |
这样就完事啦,是不是非常简单🌚,不过笔者在这里主要是为了强调正则表达式的优势哈哈哈😁,并且这种难读的表达式还需要多多操作啊。
近期评论