《编程思维与实践》1066.最小不重复数

news/2024/7/23 10:49:26 标签: 算法, c语言

《编程思维与实践》1066.最小不重复数

题目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZM0gICIV-1683975801931)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230513182602720.png)]

思路

一般在oj上循环 2 ⋅ 1 0 9 2\cdot 10^9 2109次以上就会超时,所以由于这题的数据A可以很大,直接循环加一再判断会超时.

优化:首先可以明确要想使不重复数尽可能小,则高位数字应该尽可能小,

先找到最靠前的两个重复数字,然后让后一个数字加1(保证尽可能小),这样就能保证高位数字不重复且最小,

接下来只需要保证低位数字从0开始遍历,重复上述操作即可.

如:6698->6700->6701.

注意的点:

如果复用之前对大整数的处理方式,由于加法可能会进位,逆向存较为方便,所以处理时需要注意最高位在末尾.

代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 101

typedef struct{int cnt,v[N];}BIGINT;

BIGINT carry(BIGINT S,int n);   //进位 n表示进制 
BIGINT add1(BIGINT S,int pos);   //指定位置加1
int judge(BIGINT S);     //判断是否为不重复数,遇到重复返回后一位

int main()
{
	int T;
	scanf("%d",&T);
	for(int t=0;t<T;t++)
	{
		char s[N+1];
		scanf("%s",s);
        BIGINT A={strlen(s),{0}};
        for(int i=0;i<strlen(s);i++)
		{
			A.v[A.cnt-1-i]=s[i]-'0';  //逆向存
		}
		A=add1(A,0);  //先最后一位加1
		while(judge(A)!=-1)
		{
			int temp=judge(A);
			A=add1(A,temp);
            for(int i=temp-1;i>=0;i--)  //后面全赋为0
            {
                A.v[i]=0;
            }
		}
		printf("case #%d:\n",t); 
		for(int i=A.cnt-1;i>=0;i--)
        {
            printf("%d",A.v[i]);
        }
        printf("\n");
	}
	return 0;
}

BIGINT carry(BIGINT S,int n)   //进位 n表示进制 
{
	int flag=0;
	for(int i=0;i<S.cnt;i++)
	{
		int temp=S.v[i]+flag;
		S.v[i]=temp%n;
		flag=temp/n;
	}
    if(flag)   //为了加法进行的方便 可能多一位
    {
        S.v[S.cnt++]=flag;
    }
	return S;
}

BIGINT add1(BIGINT S,int pos)     //指定位置加1
{
	S.v[pos]+=1;
	S=carry(S,10);
	return S;
}

int judge(BIGINT S)   //判断是否为重复数 
{
	for(int i=S.cnt-1;i>0;i--)   //注意是逆序存
	{
		if(S.v[i]==S.v[i-1])
		{
			return i-1;   //重复的时候返回后一位
		}
	}
	return -1;   //不重复返回0 
}

http://www.niftyadmin.cn/n/318540.html

相关文章

springboot+vue汉服文化平台网站(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的汉服文化平台网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

11.PC端网页特效

PC端网页特效 1. 元素偏移量 offset 系列 1.1 offset 概述 offset 翻译过来就是偏移量&#xff0c; 使用 offset 系列相关属性可以动态的得到该元素的位置&#xff08;偏移&#xff09;、大小等 获得元素距离带有定位父元素的位置获得元素自身的大小&#xff08;宽度高度&a…

ChatGPT是啥、注册方法

微信扫公众号&#xff1a;小X智聊 体现一下吧 ChatGPT是一款基于人工智能技术的聊天机器人平台&#xff0c;可为用户提供智能聊天、语音回答等等服务。&#xff1a; 一、ChatGPT的官网是什么&#xff1f; 二、用户如何注册成为ChatGPT的会员&#xff1f; ChatGPT的API是由Open…

LabVIEWCompactRIO 开发指南17 网络流

LabVIEWCompactRIO 开发指南17 网络流 网络流类似于队列函数&#xff0c;因为它们是基于FIFO的&#xff0c;但与队列函数不同的是&#xff0c;网络流具有网络作用域。它们是为通过以太网进行无损、高吞吐量数据通信而设计和优化的&#xff0c;并且它们具有增强的连接管理功能…

软件工程师,要么不写代码,要么就写优雅的代码

何为优雅的代码 优雅的代码&#xff0c;至少需要遵循以下几个原则&#xff1a; 遵守规范 优雅的代码&#xff0c;首先让人看起来就是很整洁的。而这种整洁&#xff0c;则来源于代码规范。严格地遵守代码规范&#xff0c;是提高且保证代码质量的最有效方法。从个人开发的角度来看…

42个网工高效率工具,我只告诉你(一)

晚上好&#xff0c;我是老杨。 不知道上一篇书单总结&#xff0c;你是否觉得干货 今天更新第四篇&#xff0c;也是最后一篇总结——2022年全年&#xff0c;我安利给你的网工好用工具&#xff0c;整整42个。 它是什么&#xff0c;为什么好用&#xff0c;哪里下载&#xff0c;…

[ 云计算 华为云 ] 华为云开天 aPaaS:构建高效的企业数字化平台(下)

文章目录 前言四、华为云开天aPaaS 核心功能4.1 业务模型管理4.2 连接器4.2.1 连接器的种类4.2.1.1 公共连接器4.2.1.2 私有连接器 4.2.2连接器的开发步骤 4.3 自动化流4.3.1 自动化流介绍4.3.2 自动化流日志监控 4.4 自定义逻辑处理4.5 分享连接器和流模板 五、aPaaS 的应用实…

基于常用设计模式的业务框架

前言 做开发也有好几年时间了&#xff0c;最近总结和梳理自己在工作中遇到的一些问题&#xff0c;工作中最容易写出BUG的需求就是改造需求了。一个成熟的业务系统是需要经过无数次迭代而成的&#xff0c;也意味着经过很多开发人员之手&#xff0c;最后到你这里&#xff0c;大部…