1. 程式人生 > >【Leetcode7-反轉整數 Reverse Integer】(C語言)

【Leetcode7-反轉整數 Reverse Integer】(C語言)

目錄

反轉整數:

測試單元

反轉整數:

給定一個32位有符號整數,將整數中的數字進行反轉。

示例1:

輸入: 123
輸出: 321

 示例2:

輸入: -123
輸出: -321

示例3:

輸入: 120
輸出: 21

注意:

假設我們的環境只能儲存32位有符號整數,其數值範圍是[-231,231 - 1]。根據這個假設,如果反轉後的整數溢位,則返回0。

測試單元

如題我們先寫一個測試單元(題目中已經給出3種可能出現的情況:一般情況正整數,負數,以零結尾的整數)還有一個條件就是得在瞄準者的可表示的範圍內,所以。我們個這種情況也加上測試用例測試單元如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int n1 = 123;
	int n2 = -123;
	int n3 = 120;
	int n4 = (INT_MAX + 1);
	int n5 = (INT_MIN - 1);
	int i1 = reverse(n1);
	int i2 = reverse(n2);
	int i3 = reverse(n3);
	int i4= reverse(n4);
	int i5 = reverse(n5);
	printf("%d,%d,%d,%d,%d\n", i1, i2, i3,i4,i5);
	system("pause");
	return 0;
}

由題目知道:123-> 321可以將拆分為3 * 10的0次方+ 2 * 10的一次放+ 3 * 10的二次方由此可以用遞迴實現

(1)遞迴版

遞迴反回的條件是直到要反轉的整數的第一位

加上我們要的範圍條件就是反轉後的整數在int可表示的範圍內INT_MAX INT_MIN

int reverse(int x)
{
	int Resault = 0;
	static int Pos = 10;
	if (x / 10 == 0)      //遞迴返回的條件
	{
		Pos = 10;
		return x;
	}
	Resault = reverse(x / 10) + x % 10 * Pos;
	Pos *= 10;
	if (Resault< INT_MIN || Resault>INT_MAX)  //範圍限定條件
	{
		return 0;
	}
	return Resault;
}

我們可以將遞迴版的優化為簡單的迴圈來實現反轉整數的目的:

(2)優化版1

我們害怕反轉的值超出int可以有效表達的範圍用長型別來表示反轉後的值,在最後進行判定是否符合在int型別的有效表達範圍。

int reverse(int x) {
	long i = 0;
	long t = x;
	while (t)
	{
		i = 10 * i + (t % 10);
		t /= 10;
	}
	if (i < INT_MIN || i >INT_MAX)  //判定是否在int可表達的有效範圍內
	{
		return 0;
	}
	return i;
}

這樣判定放式只能在得到反轉值之後進行判定,在反轉過程種進行判定,可以更高效的解決這個問題。

(3)優化版2

只要在反轉過程種不滿足迴圈體種的式子就意味著這個傳入的引數不合法超出了int可表示的範圍

int reverse(int x)
{
	int i = 0;
	while (x)
	{
		int temp = i;
		i = i * 10 + x % 10;
		if ((i - x % 10) / 10 != temp)
		{
			return 0;
		}
		x /= 10;
	}
	return i;
}

(4)複雜度分析

  • 時間複雜度:O(log(x)),x中大約有log_{10}(x)位數字。
  • 空間複雜度:O(1)。