刪除k个数字后的最小值

前言

比如说 1593212,去掉一个数字后,保留的是最小值。

原理:因为要保留最小值,那么要删除最高位的数字是最明显的。

那么1和5到底删除哪一个呢?当然是删除最大值了。

代码

public static int AfterdeleteKeys(int init,int keys)
{
	string temp = init.ToString();
	if (temp.Length <= keys)
	{
		return 0;
	}
	var hasdel = false;
	for (; keys > 0;)
	{
		hasdel = false;
		for (int i = 0; i < temp.Length-1; i++)
		{
			if (temp[i]>=temp[i+1])
			{
				hasdel = true;
				temp = temp.Substring(0, i) + temp.Substring(i+1,temp.Length-i-1);
				keys--;
				break;
			}
		}
		if (!hasdel)
		{
			break;
		}
	}
   temp= temp.Substring(0,temp.Length-keys);
	return Convert.ToInt32(temp);
}

static void Main(string[] args)
{
	Console.WriteLine(AfterdeleteKeys(123467,1));
	Console.ReadKey();
}

上面效率并不高。
优化,将char[] 物理结构转换为 stack 逻辑逻辑。

public static int AfterdeleteKeys(int init, int keys)
{
	var temp = init.ToString();
	if (keys >= temp.Length)
	{
		return 0;
	}
	char[] stack = new char[temp.Length - keys];
	var top = 0;
	for (int i = 0; i < temp.Length; i++)
	{
		char c=temp[i];
		if (top > 0 && stack[top - i] > c && keys > 0)
		{
			top--;
			keys--;
		}
		if (top < stack.Length)
		{
			stack[top] = c;
			top++;
		}
		else
		{
			break;
		}
	}
	var offset = 0;
	while (offset < stack.Length && stack[offset] == '0')
	{
		offset++;
	}
	return offset == stack.Length ? 0 :Convert.ToInt32(new String(stack,offset,stack.Length-offset));
}


static void Main(string[] args)
{
	Console.WriteLine(AfterdeleteKeys(123467,1));
	Console.ReadKey();
}
posted @   敖毛毛  阅读(169)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示