1、google笔试:编码实现求给定字符串(全为小写英文字母)的最小后继,如“abc”的最小后继为 “abd”,“dhz”的最小后继为“dj”。
思路:题目比较简单,对最后一个字符+1,如果大于’z’则对前一个字符+1,如果又是大于 ’z’,重复之前步骤。所以写代码时,我们只要对字符串循环从后往前对每一个字符进行+1,直到出现+1后不超过’z’为止。如果退出循环时第一个字符大于于’z’则提示不存在,否则把退出循环的字符的后一位置为’\0’即可。
代码:
int
MinNextStr(
const
char
*
src,
char
*
&
minnext)
{
int
srclen
=
strlen(src);
minnext
=
(
char
*
)malloc((srclen
+
1
)
*
sizeof
(
char
));
if
(minnext
==
NULL)
{
return
-
1
;
}
strcpy(minnext,src);
int
i
=
srclen
-
1
;
while
(i
>=
0
)
{
minnext[i]
++
;
if
(minnext[i]
<=
'
z
'
)
{
break
;
}
i
--
;
}
if
(i
<
0
)
{
return
0
;
}
else
{
minnext[
++
i]
=
'
\0
'
;
return
1
;
}
}
如果把给定字符串全为小写英文字母改为大小写英文字母,则只要把:if(minnext[i]<='z')改为 if(minnext[i]<='z'&&minnext[i]>'a'||minnext[i]<='Z'),注意minnext[i]<='z'&&minnext[i]>'a'是为了防止minnext[i]为大写的情况,因为大写英文字母(A:65)比小写(a:97)的ASCII 码小,如果不加minnext[i]>'a'则minnext[i]为(’Z’+1,ASCII 码:91)也会跳出循环。
2、中兴:编码实现字符串右移n位,如“diopHeg”右移2位为“egdiopH”
思路1:只要把需要移动的最后n个字符保存下来,把前面剩下的全部后移n个位置,最后把开始保存好的n 个字符填充到前面n个位置。注意:n超过字符串长度的情况,所以事前先做n mod 字符串的长度。
代码:
int
RightMoveStr(
char
*
src,
int
n)
{
int
len
=
strlen(src);
int
mov
=
n
%
len;
char
*
rstr
=
(
char
*
)malloc((mov
+
1
)
*
sizeof
(
char
));
if
(rstr
==
NULL)
{
return
0
;
}
int
i
=
0
;
while
(i
<
mov)
{
rstr[i]
=
src[len
-
mov
+
i];
i
++
;
}
rstr[i]
=
'
\0
'
;
i
=
len
-
mov
-
1
;
while
(i
>=
0
)
{
src[i
+
mov]
=
src[i];
i
--
;
}
i
=
0
;
while
(i
<
mov)
{
src[i]
=
rstr[i];
i
++
;
}
free(rstr);
return
1
;
}
/*思路2:使用字符串库函数简化编码工作,用一个新的字符串ss保存结果,先把源字符串指针s移到需要右移的子串的第一个字符的位置,如 “diopHeg”右移2位就把s移动到指向’e’,接着 strcpy(ss,s),把s所指位置赋值为’\
0
’,最后strcat(ss,s)。*/
int
RightMove(
char
*
src,
char
*
&
ssrc,
int
n)
{
int
len
=
strlen(src);
ssrc
=
(
char
*
)malloc(
sizeof
(
char
)
*
(len
+
1
));
n
=
n
%
len;
if
(ssrc
==
NULL)
{
return
0
;
}
int
i
=
0
;
char
*
s
=
src;
while
(i
<
len
-
n)
{
s
++
;
i
++
;
}
strcpy(ssrc,s);
*
s
=
'
\0
'
;
strcat(ssrc,src);
return
1
;
}
3、新邮通:字符串反转:给定字符串“we;tonight;you;”,编码实现输出“ew;thginot;uoy;”
思路:使用两个变量first和end分别记录当前需要反转的子串的头和尾字符的下标,每遇到’;’就把first和end之间的子串进行前后反转。
代码:
void
ReverseStr(
char
*
src)
{
int
len
=
strlen(src);
int
i
=
0
;
int
first
=
0
;
int
end
=
0
;
while
(i
<
len)
{
if
(src[i]
==
'
;
'
)
{
end
=
i
-
1
;
while
(first
<
end)
{
char
temp
=
src[first];
src[first]
=
src[end];
src[end]
=
temp;
first
++
;
end
--
;
}
first
=
i
+
1
;
}
i
++
;
}
}
如果给定字符串结尾没有’;’,如“we;tonight;you”,编码实现输出“ew;thginot;uoy”,只需要修改一下代码9、10、11行:
if
(src[i]
==
'
;
'
||
i
==
len
-
1
)
{
if
(src[i]
==
'
;
'
)
end
=
i
-
1
;
else
end
=
i;
4、西艾:X86结构下,下面代码输出结果是什么?
代码:
char
str[
20
]
=
"
Good night
"
;
int
*
p
=
(
int
*
)str;
p[
0
]
=
0x61626364
;
p[
1
]
=
0x31323334
;
p[
2
]
=
0x41424344
;
cout
<<
str
<<
endl;
解题:考察知识点:
(1)int的内存大小:32bit=4byte;char的内存大小:4bit=1byte;
(2)常用字符的ASCII 码,’a’:97;’A’=65;’0’=48;
(3)十六进制转,0x61=97;
4)大小端模式:
所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
所谓的大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
而X86结构为小端模式,所以:
p[0]=0x61626364;//97,98,99,100对应a,b,c,d,小端存在字符串str则为dcba
p[1]=0x31323334;//同理4321
p[2]=0x41424344;//同理DCBA
代码输出:dcba4321DCBA