1. 程式人生 > >leetcode——三種方法判斷迴文數

leetcode——三種方法判斷迴文數

1、第一種方法,利用sprintf函式,將整數格式化到陣列中,以單個元素的形式存放,便於訪問每一個位數。然後在陣列中前後判斷,其實這個方法和入棧出棧的思想有點相似,只是不是用明顯的用棧的操作。

/*
判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

示例 1:
輸入: 121
輸出: true

示例 2:
輸入: -121
輸出: false
解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個迴文數。

進階:

你能不將整數轉為字串來解決這個問題嗎?
*/
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>

/** \brief
*判斷迴文數
* \param int x
* \param
* \return bool
*
*/
bool isPalindrome(int x)
{
    char numTemp[20] = {0};

    //n接收轉換了多少個字元
    int n = sprintf(numTemp, "%d", x);
    //負數直接不是迴文數
    if(x < 0)
        return false;
    //單個數字必是迴文數
    else if(1 == n)
        return true;
    //判斷前後是否迴文
    else
    {
        for(int i = 0; i < n/2; i++)
        {
            if(numTemp[i] == numTemp[n-i-1])
                continue;
            return false;
        }
        return true;
    }
}

int main()
{
    int x = 1234321;

    bool flag = isPalindrome(x);

    printf("%d\n\n",flag);
}

2、利用迴文數的數字特點來判斷,這個是在網上看到的,感覺非常巧妙。

#include <stdio.h>
void main(){
    int num,s,y=0;
    printf("Please input numbers: ");
    scanf("%d", &num);
    s=num;
    while(s>0){
        y=y*10+s%10;
        s=s/10;
    }
    if(y==num){
        printf("%d是一個迴文數!\n", num);
    }else{
        printf("%d不是一個迴文數!\n", num);
    }
}

3、利用棧操作來判斷

/*
棧操作判斷迴文數
*/
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>

#define STACK_LENGTH    20

typedef struct st{
    char num[STACK_LENGTH];   //棧記憶體
    int top;                 //棧頂指標
}myStack;


//棧初始化,為棧分配記憶體,並初始化棧頂指標
myStack* stackInit(void)
{
    myStack* p;

    if(p = (myStack*)malloc(sizeof(myStack)))
    {
        p->top = 0;
        return p;
    }
    return 0;
}

//入棧操作
int stackPush(myStack* s, int data)
{
    if(s->top+1 > STACK_LENGTH)
    {
        printf("waring : stack over!!!\n\n");
        return 0;
    }

    s->num[++(s->top)] = data;
    return 1;
}

//出棧操作,返回出棧的元素
int stackPop(myStack* s)
{
    if(0 == s->top)
    {
        printf("waring : stack empty!!!\n\n");
        return 0;
    }

    return (s->num[s->top--]);
}

//釋放棧記憶體
void stackFree(myStack* s)
{
    if(s)
        free(s);
}


/** \brief 利用棧判斷迴文數
*
* \param
* \param
* \return
*
*/
bool isPalindrome(int x)
{
    char tempNum[STACK_LENGTH] = {0};
    int count = sprintf(tempNum, "%d", x);

    myStack* pStack = stackInit();
    for(int i = 0; i < count; i++)
        stackPush(pStack, tempNum[i]);

    for(int j = 0; j < count; j++)
    {
        if(tempNum[j] != stackPop(pStack))
        {
            stackFree(pStack);
            return false;
        }
    }
    stackFree(pStack);
    return true;
}


int main()
{
    int x = 256;
    bool flag = isPalindrome(x);

    printf("%d\n\n",flag);
}