回文数&&自除数&&复制带随机指针的链表

举报
芒果_Mango 发表于 2022/11/30 23:54:22 2022/11/30
【摘要】 方法1:使用字符串的方式,将x转为字符串,然后反转比较是否和原来的字符串内容相同class Solution {public: bool isPalindrome(int x) { string s1 = to_string(x);//将原整数转为字符串 string s2 =s1; reverse(s2.begin(),s2.end());/...

方法1:使用字符串的方式,将x转为字符串,然后反转比较是否和原来的字符串内容相同

class Solution {
public:
    bool isPalindrome(int x) {
        string s1 = to_string(x);//将原整数转为字符串
        string s2 =s1;
        reverse(s2.begin(),s2.end());//反转
        return s1 == s2;//比较字符串是否相同
        // 注意:char* str1,*str2  不能直接str1 == str2  ,要使用strcmp比较
        //但是string中重载了operator==,所以可以直接判断相同
    }
};

方法2:对x不断取% 然后乘10,看得到的数是否和原来的数相同

一个数逆转:sum = sum*10 + num%10 其中num为原来的数,sum为后来的数

方法2要考虑溢出的问题!溢出值不是回文数

class Solution {
public:
    bool isPalindrome(int x) {
        //负数前面有负号,肯定不是回文数
        if(x < 0) return false;
        //溢出值肯定不是回文,考虑边界
        if(x == INT_MAX || x == INT_MIN) return false;
        //注意:要定义为long类型,防止溢出
        long ans = x;//先记录原来的数
        long num = x;
        long sum = 0;//记录重新恢复的数
        while(num>0)
        {
            sum = sum*10 + num%10;
            num/=10;
        }
        return ans == sum;
    }
};

728. 自除数

https://leetcode.cn/problems/self-dividing-numbers/

image-20220524090126116

又题目含义可以得知:我们只需遍历[left,right]范围的数,判断是否是自除数即可

如何判断呢? 只需要判断当前位置的数,是否能被它的每一位数整除即可! 注意:自除数不允许包含0,即如果某一位是0,就返回false

class Solution {
public:
    bool Check(int num)
    {
        int tmp = num;
        //得到tmp的每一位进行判断,自除数可以被它的每一位整除
        while(tmp)
        {
            int i = tmp%10;//得到tmp的最后一位
            //被除数不能为0 -> 0不可以作为自除数
            if(i == 0 || num%i != 0) 
            {
                return false;
            }
            tmp/=10;
        }
        return true;
    }
    vector<int> selfDividingNumbers(int left, int right) {
        vector<int> v;
        for(int i = left;i<=right;i++)
        {
            if(Check(i)) v.push_back(i);
        }
        return v;
    }
};

138. 复制带随机指针的链表

https://leetcode.cn/problems/copy-list-with-random-pointer/

class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(head == nullptr)
        {
            return nullptr;
        }
        // key -> 老节点
		// value->老节点的拷贝结点,新节点
        unordered_map<Node*,Node*> um;//老链表的节点,新链表的节点
        Node* cur = head;
        while(cur)
        {
            um.insert(make_pair(cur,new Node(cur->val)));//把每个结点构建克隆结点,放到map中
            cur = cur->next;
        }
        cur = head;//从头开始遍历
        while(cur)
        {
            //cur :老结点
			//um[cur]: 新结点
            //um[cur]对应的就是cur节点的拷贝节点,对应的处理它的next和random指针的链接关系
            
            um[cur]->next = um[cur->next];//新节点的next 链接cur->next对应的克隆节点
            um[cur]->random = um[cur->random];//新节点的rand 链接cur->rand对应的克隆节点
            cur = cur->next;
        }
        //返回老头部对应的新头部
        return um[head];
    }
};

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。