Reverse digits of an integer.

来源:互联网 发布:sql语句高级查询 编辑:程序博客网 时间:2024/06/05 03:10

Example1: x = 123, return 321
Example2: x = -123, return -321

挺简单的一个题目,只需要分情况讨论即可,因为一个int型数据可能是正数可能是负数,也可能为0,当然还有一种很重要的情况就是溢出,当实参大于int的最大值的情况下的处理,直接返回0即可

class Solution {public:int reverse(int x) {if (x == 0){return x;}bool negative = false;if (x < 0){negative = true;x = 0 - x;}//检测该x是否已经溢出,溢出时直接返回0int max = numeric_limits<int>::max();if (x>max)return 0;//到此为止,x已经是非负值了int nBits = 1, nAverage = 10;int tmp = x;while (true){if (nAverage == 1000000000){if ((tmp / nAverage<10)&&(tmp/nAverage!=0)){nBits++;break;}}if (tmp / nAverage){nBits++;nAverage *= 10;}elsebreak;}//到现在为止 nBits是和x位数一致,nAverage和x的位数也是一致的int* nArray = new int[nBits];int  nCount = 0;tmp = x;if (nBits != 10){                    //如果nBits不为0,也就是肯定没有溢出的情况下,则nAverage的值是多乘了一个10,进行矫正                     nAverage /= 10;}while (nCount<nBits){nArray[nCount++] = tmp / nAverage;tmp -= nAverage*nArray[nCount - 1];nAverage /= 10;}//进行新数组的构造,作为返回值应该是防止溢出的,所以定义为unsigned long long,在int型数据下操作是没有问题的,unsigned long long sum = 0;for (int i = 0; i < nBits; i++){unsigned long long mm = 1, m = 0;while (m!=i){mm *= 10;m++;}sum += (unsigned long long)nArray[i] * mm;                        if (sum>max)return 0;}delete[] nArray;if (negative){sum = 0 - sum;}return sum;}};
这道题教会我考虑对于一个问题,我们要考虑各种边界情况,比如为0,比如溢出...

0 0
原创粉丝点击