题解 | #解码#
解码
http://www.nowcoder.com/practice/4acd516d09ea4f47bd72527bfd40ce2a
整体思路:建立一个一维数组arr[len],用来记录每一个位置当前有多少种译码结果。
主要判断有0的情况:1.连续俩个零代表译码有误,输出零
2.如果第一个位置就是'0',输出零
3.当前位置为'0',前一个位置不是'1'或'0',输出零
否则,arr[0]记录为1,若果第二个位置是符合上面输出零的情况,arr[1]记录为1,否则记录为2,接下来开始循环判断,只要前一位置的值与当前的值小于26,说明就有俩种译码方式,一种是俩个字符各一个,一种是直接俩位数译码,那么当前的译码方式就有arr[i-1]+arr[i-2]。
最后,需要判断字符串中有'0'的情况:1.如果当前为零,则当前位置的译码方式就是arr[i-2],应为arr[i-1]
要与'0'组合,所以要在往前一个位置
2.如果前一位置为零,则当前位置的译码方式为arr[i-1];
#include <stdio.h>
#include <string.h>
int main()
{
char s[1000];
while(scanf("%s",s)!=EOF)
{
if(s[0]=='0')
{
printf("%d\n",0);
continue;
}
int len=strlen(s);
int arr[len];
arr[0]=1;
if(((s[0]-48)*10+s[1]-48)>26)
arr[1]=1;
else
{
if(s[1]=='0')
arr[1]=1;
else
arr[1]=2;
}
int i;
for(i=2;i<len;i++)
{
if(s[i]=='0' && !('0'<s[i-1] && s[i-1]<'3'))
break;
if(s[i]=='0')
{
arr[i]=arr[i-2];
continue;
}
if(s[i-1]=='0')
{
arr[i]=arr[i-1];
continue;
}
if(((s[i-1]-48)*10+s[i]-48)>26)
arr[i]=arr[i-1];
else
arr[i]=arr[i-1]+arr[i-2];
}
if(i==len || len==1)
printf("%d\n",arr[len-1]);
else
printf("%d\n",0);
}
return 0;
}
海康威视公司福利 1315人发布

查看17道真题和解析