leetcode——三種方法判斷迴文數
阿新 • • 發佈:2019-01-01
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); }