刪除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 @ 2020-03-23 09:56  敖毛毛  阅读(168)  评论(0编辑  收藏  举报