Jin*_*oss 1 c++ arrays string dictionary
我正在尝试编写一个c ++程序来查找第一个非重复字符,如果所有字符都重复,它将返回-1.
我设计了一个解决方案,使用整数数组跟踪字符数,我使用必须存储其计数的相应字符进行索引.
计划1:提供错误的输出...... http://ide.geeksforgeeks.org/wxOYog
#include<iostream>
#include<cstring>
using namespace std;
int map[256];
string returnFirstRepeatingChar(string str,int n)
{
int i=0,flag=1;
string result;
for(i=0;i<n;i++)
map[str[i]]++;
for(i=0;i<n;i++)
{
if(map[str[i]]==1)
{
flag=0;
result = str[i];
break;
}
}
if(flag)
return "-1";
else
return result;
}
int main()
{
//code
int t,N,*arr,i,j;
cin>>t;
string str;
while(t--)
{
cin>>N;
memset(&map,0,256);
cin>>str;
cout<<returnFirstRepeatingChar(str,N)<<endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
计划2:提供正确的输出...... http://ide.geeksforgeeks.org/jJvJPu
#include<iostream>
#include<cstring>
using namespace std;
int map[256];
string returnFirstRepeatingChar(string str,int n)
{
int i=0,flag=1;
string result;
for(i=0;i<n;i++)
map[str[i]-97]++; //changed from above program
for(i=0;i<n;i++)
{
if(map[str[i]-97]==1) //changed from above program
{
flag=0;
result = str[i];
break;
}
}
if(flag)
return "-1";
else
return result;
}
int main()
{
//code
int t,N,*arr,i,j;
cin>>t;
string str;
while(t--)
{
cin>>N;
memset(&map,0,256);
cin>>str;
cout<<returnFirstRepeatingChar(str,N)<<endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
两个程序之间的区别仅在于数组映射中所需计数的位置.在程序1中,它从97开始(ascii of a)在程序2中,它从0开始.
但程序2给出正确的输出,但程序1不是.为什么?
Eg: for input: abcdefghij
program 1 output: f
program 2 output: a
Run Code Online (Sandbox Code Playgroud)
这里的一个重要问题是这一行:
memset(&map,0,256);
Run Code Online (Sandbox Code Playgroud)
在这里,您只将第一个256/sizeof(int)归零.如果sizeof(int)是4,那么第一个64 int.但是,您的程序正在使用索引大于97的元素,因此出现问题.因此它应该是
memset(&map,0,256*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
或者也可以简单地写成
memset(map,0,sizeof(map));
Run Code Online (Sandbox Code Playgroud)
请记住:memset的第3个参数是"要填充的字节数",而不是"数组元素的数量"
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |