Qualcomm Interview Question
Software Engineer / DevelopersHopefully this works...
#include<stdio.h>
char* xstrstr (char * source, char * possible_substr)
{
char* p1 = source;
char* p2 = possible_substr;
char* retPtr;
do
{
p2 = possible_substr;
while ( *p1 != *p2 )
{
if ( *p1 == '\0' )
return NULL;
p1++;
}
retPtr = p1;
while( *p1 == *p2 )
{
if ( *p1 == '\0' )
break;
p1++;
p2++;
}
if ( *p2 == '\0' )
return retPtr ;
}while(*p1 != '\0' );
return NULL;
}
int main(int argc,char** argv)
{
char* ptr = xstrstr(argv[1],argv[2]);
if ( ptr != NULL)
{
printf("%s\n",ptr);
}
}
char* mystrstr( const char* s2, const char * s1) {
char * res = NULL;
if (!*s1)
return s2;
while(*s2) {
//putchar(*s2);
if (*s2 != *s1)
s2++;
else { // they match
res = s2;
printf("\nthey match\n");
while ( *s2 && *s1 ) {
if (*s2 != *s1) {
printf("\n inside if .. s2 is %s and s1 is %s\n", s2, s1);
// putchar(*s2);
// putchar('\n');
// putchar(*s1);
res = NULL;
break;
}
s2++;
s1++;
}
}
}
if ( *s1 != '\0')
res = NULL;
return res;
}
Without debugging stuff this time -
{{
char* mystrstr( const char* s2, const char * s1) {
char * res = NULL;
if (!*s1)
return s2;
while(*s2) {
if (*s2 != *s1)
s2++;
else { // they match
res = s2;
while ( *s2 && *s1 ) {
if (*s2 != *s1) {
res = NULL;
break;
}
s2++;
s1++;
}
}
}
if ( *s1 != '\0')
res = NULL;
return res;
}
}}
char *strstr(char *str1,const char*str2)
{
//May not be the fastest possible solution, but it should work fine and is ridiculously readable.
for(int i=0;str1[i];i++)
{
for(int j=0;str2[i];j++)
{
if(str1[i+j]!=str2[i+j])
{
if(str1[i+j]==0)
return NULL;
break;
}
if(!str2[j])
return str1[i];
}
}
return NULL;
}
//Once more, with whitespace... If I'm going to promote readability at least.
char *strstr(char *str1,const char*str2)
{
for(int i=0;str1[i];i++)
{
for(int j=0;str2[i];j++)
{
if(str1[i+j]!=str2[i+j])
{
if(str1[i+j]==0)
return NULL;
break;
}
if(!str2[j])
return str1[i];
}
}
return NULL;
}
const char* myStrStr2(const char str1[], const char str2[])
{
if ((!str1)||(!str2))
return NULL;
const char* p1 = str1;
const char* p2 = str2;
int n = 0;
int n2 = 0;
while (*p2!=0)
{++n2;++p2;}
int* ind2 = new int[n2-1];
const char* ptemp;
for (int i=n2-2;i>=0;--i)
{
ind2[i] = i+1;
}
for (int i=n2-2;i>0;--i)
{
ptemp = str2+i;
p2 = str2;
while((*ptemp!=0)&&(*ptemp==*p2))
{
ind2[ptemp-str2] = ind2[ptemp-str2]<i?ind2[ptemp-str2]:i;
++p2;++ptemp;
}
}
p2 = str2;
while(*p1!=0)
{
if (*p1==*p2)
{
++p1;++p2;++n;
}
else
{
if(n!=0)
{
p2 = p2-ind2[n-1];
n = n-ind2[n-1];
}
else
{
++p1;
++p2;
}
}
if (*p2==0)
{
delete [] ind2;
return (p1-n);
}
}
delete [] ind2;
return NULL;
}
#include<stdio.h>
char* mystrstr(char* src, char* substr){
char* psrc = src;
char* psubstr = substr;
char* presult = NULL;
if (src == NULL || substr == NULL){
return NULL;
}
do{
presult = psrc;
while(*psrc++ == *psubstr++){
if (*psubstr == '\0')
return presult;
}
psubstr = substr;
}while(*psrc != '\0');
return NULL;
}
int main(int argc, char** argv){
char* ptr = mystrstr(argv[1], argv[2]);
if(ptr != NULL)
printf("%s\n", ptr);
else
printf("no match found\n");
return 0;
}
char * strstr(char * src, const char * match)
{
int loop;
int len_src = 0;
int len_mat = 0;
char * p_src;
char * p_mat;
p_src = src;
while(*p_src != 0x00) len_src++;
p_mat = match;
while(*p_mat != 0x00) len_mat++;
if(len_src == len_mat && *src != *match || len_src < len_mat) {
return NULL;
}
else {
for(loop = 0; loop < len_src - len_mat; loop++){
p_mat = match;
p_src = src + loop;
if(*p_mat == *p_src) {
while(*p_mat++ == *p_src++);
if(*p_mat == 0x00) return (src + loop);
else continue;
}
else {
return NULL;
}
}
}
}
Make a bet with the recruiter that you can write it with no while, for, or goto's.
If they take the bet, make another bet that you can write it with no local variables
other than the parameters. Produce the code below.
Agree that the solution is inefficient
char *strstr(const char *s1, const char *s2) {
if (!*s2) return (char *)s1;
if (!*s1) return NULL;
if ((*s1 == *s2) && (strstr(s1+1, s2+1) == s1 + 1) return (char *)s1;
return strstr(s1 + 1, s2);
}
#include <stdio.h>
int main()
{
char *str = "helloworld";
char *substr = "owo";
int substr_len = 0;
int i = 0, j = 0, count = 0;
for(i = 0; substr[i] != '\0'; i++)
substr_len++;
for(i = 0; str[i] != '\0'; i++) {
for (j = 0; substr[j] != '\0'; j++) {
if (str[i+j] == substr[j])
count++;
}
if (count == substr_len) {
printf("%s\n", str+i);
return 0;
}
count = 0;
}
return -1;
}
QC means Qualcomm;
- BayE June 28, 2009And the most correct answer is the code from MS VC++ source code:
char * srstr (const char * str1,
const char * str2)
{
char *cp = (char *) str;
char *s1, *s2;
if (!subStr) return NULL;
while (*cp)
{ s1 = cp;
s2 = (char *) subStr;
while ( *s1 && *s2 && !(*s1-*s2) )
s1++, s2++;
if (!*s2) return(cp);
cp++;
}
return NULL;
}