领扣刷题 leetcode 09

9.回文数

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 示例 1:

    • 输入: 121
    • 输出: true
  • 示例 2:
    • 输入: -121
    • 输出: false
    • 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
  • 示例 3:
    • 输入: 10
    • 输出: false
    • 解释: 从右向左读, 为 01 。因此它不是一个回文数。

      进阶:

      你能不将整数转为字符串来解决这个问题吗?

昨天看题目的时候不小心看了一下官方的解释,所以相当于部分借鉴了官方解法...,但是好像还没是没有官方写的好.

下面是我自己的解法 顺便放上能完整运行的c程序

#include <stdio.h>
#include<stdbool.h>
bool isPalindrome(int x);
int main()
{
    printf("%d", isPalindrome(-1));
    printf("%d", isPalindrome(0));
    printf("%d", isPalindrome(10));
    printf("%d", isPalindrome(121));
    printf("%d", isPalindrome(123321));
    return 0;
}
bool isPalindrome(int x) {
    /*(这里借鉴了官方,主要就是为了过滤参数,过滤的情况有 1.负数情况,这很显然不是回文数, 2. 末尾为0的情况(注意0必须排除,官方没有提醒我0也是回文数....其实是我自己傻)*/
    if(x<0||(x%10==0&&x!=0))
        return false;
    int left=x;
    int right=0;/*这两个参数的含义是x的左半部分和右半部分*/
    while(left>right){
        right=right*10+left%10;
        if(left==right){
            return true;
        }
        left=left/10;
    }
    if(left==right){
        return true;
    }
    return false;
}

我来解释一下上面那个while循环里的内容

首先,跳出条件是left<=right,即左边大于右边

比如 12361 当读取到中间的时候 left=12 right=163 即左边比右边低一位(x为奇数) 或者 相同位数的时候跳出(x为偶数)

right=right*10+left%10这个没什么好解释的,就是右边又多了一位

接下来必须判断一次 left==right 因为当x为单数时 比如x=121,left=12 right=12 是应该返回true的,没有办法很好的解决这个问题,所以需要增加一次判断

接下来摆官解

bool isPalindrome(int x) {
    if(x < 0 || (x % 10 == 0 && x != 0)) {
        return false;
    }
    int revertedNumber = 0;
    while(x > revertedNumber) {
        revertedNumber = revertedNumber * 10 + x % 10;
        x /= 10;
    }
    return x == revertedNumber || x == revertedNumber/10;
}

首先 第一个判断没什么好解释的,和我的一样(我和他一样才对)

哇,官解的写好和我好像,他好像能够避免 while循环内的判断

让我看看他是怎么做到的

他在返回时增加了一个x == revertedNumber/10 很好的解决了这个问题...我没想到

举个例子 x=121,退出循环时 left(x)=1 right(revertedNumber)=12 就解决了这个问题

今天的我还是好菜啊!!

原文地址:https://www.cnblogs.com/WuLiaoTC/p/10323771.html

时间: 2024-08-30 17:17:38

领扣刷题 leetcode 09的相关文章

力扣刷题记录(一)

今天开始正式刷题,为找工作做准备,这篇博客用来记录一下:刷题顺序是先刷hot题目前100个 1.两数之和: 比较简单,一次就做出来. 思路:python的字典是哈希存储的,看了一下dict内置方法只有has_key,所以将值作为key,下标作为value,存储字典,然后遍历列表,以当前值为基准,用has_key判断(target-当前值)是否存在,存在则返回相应的下标即可.,代码如下: class Solution(object): def twoSum(self, nums, target):

leetcode力扣刷题系列python——3、无重复字符的最长子串

题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1. 解法: 采用哈希表法:设定左右双指针l和r,遍历字符串:哈希表存储某字符s[i]最新在字符串中出现的位置index + 1,key, value

力扣刷题日记 2020/03/18

力扣2  两数相加 今天刷乐扣的时候发现好多人对这道题目的解法不是很理解 于是写下我自己的理解过程 共同学习! 题干 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. 您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 已提供一个实体类: /** * Definition for singly-linked list. */ publi

力扣刷题(一)

两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] def run(nums,target): ''' 解题思路: 假定target是由nums列表内的两个元素 i

[刷题] LeetCode 283 Move Zeros

要求: 将所有的0,移动到vector的后面比如; [1,3,0,12,5] -> [1,3,12,5,0] 第一版程序,时间.空间复杂度都是O(n) 1 #include<iostream> 2 #include<vector> 3 4 using namespace std; 5 6 class Solution{ 7 public: 8 void moveZeros(vector<int>& nums){ 9 vector<int> no

[刷题] LeetCode 209 Minimum Size Subarray Sum

要求 给定一个含有 n 个正整数的数组和一个正整数 s 找出该数组中满足其和 ≥ s 的长度最小的连续子数组 如果不存在符合条件的连续子数组,返回 0 示例 输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的连续子数组 思路 暴力解法(n3) 滑动窗口() 1 class Solution{ 2 public: 3 int minSubArrayLen(int s, vector<int>& nums){ 4 int

[刷题] LeetCode 3 Longest Substring Without Repeating Character

要求 在一个字符串中寻找没有重复字母的最长子串 思路 滑动窗口 如果当前窗口没有重复字母,j右移,直到包含重复字母 i右移,直到不包含重复字母 用数组记录字母是否出现过,判断重复 实现 1 class Solution{ 2 public: 3 int lenthOfLongestSubstring(string s){ 4 int freq[256] = {0}; 5 int l = 0, r = -1; 6 int res = 0; 7 8 while(l < s.size()){ 9 if

[刷题] LeetCode 203 Remove Linked List Elements

要求 在链表中删除值为val的所有节点 示例 如 1->2->3->4->5->6->NULL,要求删除值为6的节点 返回1->2->3->4->5->NULL 思路 删除一般元素(包括最后一个元素) 删除第一个元素 实现 常规思路 1 #include <iostream> 2 using namespace std; 3 4 struct ListNode { 5 int val; 6 ListNode *next; 7 L

[刷题] LeetCode 24 Swap Nodes in Paris

要求 给定一个链表,对于每两个相邻的节点,交换其位置 示例 1->2->3->4->NULL 2->1->4->3->NULL 实现 1 struct ListNode { 2 int val; 3 ListNode *next; 4 ListNode(int x) : val(x), next(NULL) {} 5 }; 6 7 class Solution { 8 public: 9 ListNode* swapPairs(ListNode* head)