题意 :给你一个字符串,但是空格丢失,问你需要多少次操作能够让这个字符串可以看成合法的逆波兰式,例如12*3*4不是合法的逆波兰式,但是12*34*可以看成1 2*34*是正确的逆波兰式。
思路 :当数字的个数比操作符的个数多的时候显然交换所用的操作次数少,只要把操作符往最后换即可。题目中隐含的意思是12你可以看成1和2也可以看成12,做题的时候注意灵活性。
当操作符的个数比数字的个数多的时候,显然插入数字才是正确的做法,只要往前插入即可。一个合法的逆波兰式的操作符的个数最多是数字的个数-1 。
#include <stdio.h> #include <iostream> #include <string.h> using namespace std ; int main() { int n ; scanf("%d",&n) ; getchar() ; char ch[1100] ; while(n--){ scanf("%s",ch) ; int len = strlen(ch) ; int opcnt = 0 ,numcnt = 0; for(int i = 0 ; i < len ; i++) { if(ch[i] == '*') { opcnt++ ; } } if(opcnt == 0) { printf("0 ") ; continue ; } int cnt = 0 ;//*前边的数字的数量 int ans = 0 ; numcnt = len - opcnt ; for(int i = 0 ; i < len ; i++) { if(ch[i] == '*') { if(cnt > 1) cnt-- ;//只要前边有数字,*就要一直消耗掉,消耗不掉的看成一个数 else { if(numcnt > opcnt)//数字多,*往后换 { for(int j = len-1 ; j >= 0 ; j--) { if(ch[j] != '*') { swap(ch[i],ch[j]) ; cnt ++ ; ans ++ ; break ; } } } else { ans ++ ; numcnt ++ ;//数不够,插入数字 if(cnt == 0)//字符串第一个是*的时候 { i -- ; cnt = 1 ; } } } } else cnt ++ ; } printf("%d ",ans) ; } return 0 ; }