C语言编程实现:从N位数字串中删掉M个数使剩下的数字串所表示的数值最小。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言编程实现:从N位数字串中删掉M个数使剩下的数字串所表示的数值最小。相关的知识,希望对你有一定的参考价值。
参考技术A #include<stdio.h>#include<string.h>
void deletechar(char *s, char c) /*从字符串删除一个字符*/
char *p;
while(p=strchr(s,c))
while(*p)
*p=*(p+1);
p++;
*(--p)='\0';
main()
int m,n,i,j;
char *s;
char max;
clrscr();
gets(s); /*输入字符串*/
n=strlen(s); /*计算长度*/
scanf("%d",&m); /*要求删除的数量*/
if(m>=n)
return(0);
for(i=0;i<m;i++) /*每次删除一个*/
for(j=0;j<strlen(s)-1;j++) /*删除原则:从串中找一个数,若串中某数不满足单调递增条件,删除此数*/
if(s[j]>s[j+1])
max=s[j];
break;
if (j==strlen(s)-1) max=s[j]; /*循环结束,没找到:单调递增,删除最后一个*/
deletechar(s,max);
printf("%s",s);
getch();
本回答被提问者采纳 参考技术B 大哥,题目最好自己想,不要老想着别人帮你做,自己想通才是自己的东西
数组最后剩下的数字
1、题目描述:
有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。
2、思路:
这道题明显改编自剑指offer的圆圈中最后剩下的数字。具体解题思路主要借助于list集合,直接用数组删除元素代价极高。
将数组元素放到list里,定义一个指针,维护这个指针,当指针指向的index超出list的范围,将指针从头开始。
3、代码:
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in=new Scanner(System.in); while(in.hasNext()){ int k=in.nextInt(); int [] a=new int [k]; for(int i=0;i<k;i++){ a[i]=i; } int result=lastIndexDelete(a); System.out.println(result); } } public static int lastIndexDelete(int [] a){ //只要找到最后一个删除的数,再去原数组中定位其下标即可 ArrayList<Integer> list=new ArrayList<>(); for(int i=0;i<a.length;i++){ list.add(a[i]); } int cur=0; while(list.size()!=1){ cur+=2;
//此处用while循环防止list剩下少量元素时,一次置零还是越界 while(cur>=list.size()){ cur = cur - list.size(); } list.remove(cur); } int lastNum=list.get(0); int result=-1; for(int i=0;i<a.length;i++){ if(lastNum==a[i]){ result=i; } } return result; } }
以上是关于C语言编程实现:从N位数字串中删掉M个数使剩下的数字串所表示的数值最小。的主要内容,如果未能解决你的问题,请参考以下文章
hdu 3183 A Magic Lamp(给一个n位的数,从中删去m个数字,使得剩下的数字组成的数最小(顺序不能变),然后输出)