一 。括号匹配(含*号)
bool checkValidString(char * s){
int i = 0 , ri = 0 ;char a[11111];
for(; *(s + i) != '\0' ; i++){
if(*(s + i) == '{' || *(s + i) == '[' || *(s + i) == '<' || *(s + i) == '(' || *(s + i )== '*'){
a[ri ++] = *(s + i);
}
else if(*(s + i) == '}'&&ri != 0){
int o = 0 , q = ri ;
while(q > 0 &&*(a + q - 1) == '*'){
o ++;
q --;
}
if(q != 0 && *(a + q - 1) == '{'){
while(o != 0){
a[q - 1] = '*';
q ++;
o --;
}
ri -- ;
}
else if(*(a + ri - 1) == '*'){
ri -- ;
}
else return 0;
}
else if(*(s + i) == '>'&&ri != 0){
int o = 0 , q = ri ;
while(q > 0 &&*(a + q - 1) == '*'){
o ++;
q --;
}
if(q != 0&&*(a + q - 1) == '<'){
while(o != 0){
a[q - 1] = '*';
q ++;
o --;
}
ri -- ;
}
else if(*(s + ri - 1) == '*'){
ri -- ;
}
else return 0;
}
else if(*(s + i) == ')'&&ri != 0){
int o = 0 , q = ri ;//ri =2 = q
while(q > 0 &&*(a + q - 1) == '*' ){
o ++;//0 = 1,
q --;//q = 1,
}
if( q!= 0&&*(a + q - 1) == '('){
while(o != 0){
a[q - 1] = '*';//s[0] = *
q ++;//q = 2
o --;//o = 0
}
ri -- ;//ri = 1
}
else if(*(a + ri - 1) == '*'){
ri -- ;
}
else return 0;
}
else if(*(s + i) == ']'&&ri != 0){
int o = 0 , q = ri ;
while(q > 0 &&*(a + q - 1) == '*' ){
o ++;
q --;
}
if(q != 0&&*(a + q - 1) == '['){
while(o != 0){
a[q - 1] = '*';
q ++;
o --;
}
ri -- ;
}
else if(*(a + ri - 1) == '*'){
ri -- ;
}
else return false;
}
else return false;
}
int z = 0 , hh = 0;
while(z < ri ){
hh = 1;
if(a[z] == '(') {
hh = 0;
for(int j = z + 1 ; j < ri ; j ++){
if(a[j] == '*') {
a[j] = 'o';
hh = 1;
break;
}
}
}
if(hh == 0) return 0;
z ++ ;
}
return 1;
}
记录下自己的血泪史还是蛮有趣的,力扣还是蛮严谨的。遇到了执行错误。是因为越界,要先判断数组存不存在,然后再判断这个数组满不满足要求(本地编译器根本不报)。如果数组判断完以后没有Return。就数组里面就只剩下左括号和星号或者其中的一种。我当时就觉得只要*号大于左括号个数就可以。但星号还可以在左括号前面。这样就构不成一对括号。在判断是不是左括号右面都有星号的时候。也有一点点问题。一是标记的方法。二就是可能会越界。1.标记方法
2.j是否越界
二 。 报数杀人问题
遗留问题。想法就没变过,就弄俩标志计数,第一个计数是人数,第二个是报数值 ,当人没被杀时:人数++(注意可以直接取余+1,也可>总人数时使其等于1),报数值++(同人数);当报数值==题目所给,即杀人(标记);就这个想法,代码实现却有些复杂
根据别人改进的代码
就在于使用两个循环使其看起来更简洁,还有就是先判断是否被杀,再加值。