东华OJ-基础题-122-循环数(C++)-难度难

  • 问题描述
    循环数是那些不包括0这个数字的没有重复数字的整数 (比如说, 81362) 并且同时具有一个有趣的性质, 就像这个例子:

如果你从最左边的数字( 记为n,在这个例子中是8) 开始往右边数,一直数n个数字(如果已经到了最右边则回到最左边),你会停在另一个不同的数字上。如果停在一个相同的数字上,这个数就不是循环数。

就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以下一个数字是6. 重复这样做 (这次从'6'开始数6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是2. 再这样做 (这次数两个): 8 1。 再一次 (这次数一个): 3。 又一次: 6 2 8, 这时你回到了起点。

此时,我们数到的数字依次是:8 6 2 1 3,即每一个数字都被数了1次,并且回到了起点。

如果你将每一个数字都数了1次以后没有回到起点, 你的数字不是一个循环数。

给你一个数字 M (在1到9位之间), 找出第一个比 M大的循环数(输入的M保证这个循环数能保存在4位的有符号整数中)。

  • 输入说明
    仅仅一行, 包括M
  • 输出说明
    仅仅一行,包括第一个比M大的循环数。
  • 输入范例
cpp 复制代码
111110
  • 输出范例
cpp 复制代码
134259

感想:按题目要求,排除含有0的数和有重复数字的数;然后关键是用什么方式访问需要的的数字,再对每次访问的单个数字做标记,我采用了vector<pair<int,bool>> arr把目标数字都存进去当做first,默认second初始都是false表示没被访问过,用arr下标决定要访问的数字,访问过的都标为true。

代码如下:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

//判断是否符合题目循环的要求
bool isLoop(const string &s) {
    vector<pair<int,bool>> arr;
    int siz = s.size();
    for(int i = 0; i<siz; ++i) {
        arr.push_back(make_pair(s[i]-'0',false));
    }

    int subscript = arr[0].first%siz;
    int cnt = siz;
    while(cnt--) {
        if(arr[subscript].second) return false;//又遇到之前标记的数字,则有的数字不会被访问到,则不是循环数
        arr[subscript].second = true;
        subscript = (subscript+arr[subscript].first)%siz;
    }
    if(subscript == arr[0].first%siz)
        return true;
    else
        return false;

}

//是否都是不重复的字符
bool isUnique(const string &s) {
    string temp = s;
    sort(temp.begin(),temp.end());
    for(size_t i = 0; i<temp.size()-1;++i) {
        if(temp[i +1] == temp[i])
            return false;
    }
    return true;
}

int getNextLoopNum(int n) {
    int res,j = n;
    while(true) {
        ++j;
        string str = to_string(j);
        if(str.find('0')!=string::npos)
            continue;//排除含有0的数
        if(isUnique(str)&&isLoop(str)) {
            res = j;
            break;
        }
    }
    return res;
}


int main() {
    int M;
    cin >> M;
    cout<<getNextLoopNum(M)<<endl;
    return 0;
}
相关推荐
小羊没烦恼!8 分钟前
Memory 记忆设计讨论:为什么 Agent Memory 不能只靠向量数据库?
java·开发语言·windows·算法·c#
FlightYe12 分钟前
音视频修炼之编码器(一):AVC、HEVC编码器内部
android·linux·c++·音视频
黑马程序员毕设24 分钟前
基于微信小程序的节目活动报名与管理系统设计与实现
java·开发语言·spring boot·后端·电脑
羑悻的小杀马特29 分钟前
数据织网者:Jsoncpp库深度解析——从C++原生JSON处理到工程级数据交互实战全攻略
c++·json·交互·jsoncpp·原生库
sunshine22 girl31 分钟前
Java学习 java原理
java·开发语言·学习
果果燕1 小时前
实习笔记(七)GFP自动化插拔测试功能协议解析
c++
宁渡AI大模型1 小时前
河南宁渡科技有限公司|宁渡课堂 AI 全栈面试分享,AI 应用开发高频考点汇总
java·c++·人工智能·python·深度学习·神经网络·rag
GG-_-Bond1 小时前
9.1 kv存储内存池模拟面试问题
c++·c
AI吃大瓜1 小时前
人脸检测和行人检测3:C/C++实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码,可实时检测)
c++·yolov8·人脸检测·人体检测·yolo11·yolo26
Persistent的粽子!2 小时前
C++的内存管理
c++·经验分享·笔记