昨天,也就是2016年3月5日晚上19:00~20:30,这是今年CVTE春招的网测时间,博主没能赶上时间,从舍友里摘取了面试安卓开发的两道网测编程题,在这里,博主要用c语言来实现它。
第一道题:字符数组的循环右移问题
题目要求:将N个字符的数组,循环右移K位。时间复杂度O(N)。
思路分析:1、含N个字符的数组;2、字符数组循环右移k位;3、时间复杂度为O(N)。我们应该看得出,有两种情况:1、k小于N;2、k大于等于N,我们不难得出,当k大于等于N时,与用N除k得出的余数y(此时,y小于N)的右移效果相同,所以,我们可以将k转化为k小于N的情况来求右移k位的字符数组。从时间复杂度上看出,我们不能用关于N的嵌套循环。由此,博主写出了下列代码:
void rightstep(char *str,int step)
{
int i,length,count;
char pt[10];
length = strlen(str); //获取字符串的字符个数
printf("原字符串为:");
for(i = 0;i < length;i++)
{
putchar(str[i]);
}
printf("\n");
count = step % length;
for(i = 0;i < length;i++)
{
pt[(i + count) % length] = str[i];
}
pt[length] = '\0';
printf("移动了%d位的数组为:",step);
for(i = 0;i < length;i++)
{
putchar(pt[i]);
}
printf("\n");
}
第二道题:字符串去重问题
题目要求:删除小写字母字符串中重复字符。如果可以,优先删除重复字符中排在比他小字符前面的字符。 比如,输入:bbcacdww;输出:bacdw
思路分析:删除字符串中的重复字符,题目还说:如果可以,优先删除重复字符中排在比他小字符前面的字符。所以,我们不妨凡是重复字符,就删除前面的重复字符,保留后面的重复字符。下面是博主用c语言实现的代码:
void quchong(char *str)
{
int i,j,length,k = 0,tf = 0,m = 0;
int in[10];
char pt[10];
length = strlen(str);
printf("原字符串为:");
for(i = 0;i < length;i++)
{
putchar(str[i]);
}
printf("\n");
for(i = length - 1;i > 0;i--)
{
for(j = i - 1;j >= 0;j--)
{
if(str[i] == str[j])
{
in[k] = j;
k++;
}
}
}
printf("去重后的字符串为:");
for(i = 0;i < length;i++)
{
for(j = 0;j < k;j++)
{
if(in[j] == i)
{
tf = 1;
break;
}
else
{
tf = 0;
}
}
if(!tf)
{
pt[m] = str[i];
//putchar(str[i]);
m++;
}
}
for(i = 0;i < m;i++)
{
putchar(pt[i]);
}
printf("\n");
}
我知道,以上两道CVTE网测编程题博主解的答案不是最优的,但也是实现了题目要求的功能,况且网测是没有那么多时间去优化代码,从这两道网侧踢,博主知道了学习c语言基础稍微不扎实,解答时容易错漏百出,也就是在c编译器上不断纠正。下面是我在vc++6.0上编译运行上述代码(包括我以上全部的驱动程序):
#include<stdio.h>
#include<string.h>
void rightstep(char *str,int step);
void quchong(char *str);
int get_int(void);
int main(void)
{
int step;
char *s = "bbcacdww";
printf("字符串为:");
printf("%s\n",s);
step = get_int();
rightstep(s,step);
quchong(s);
return 0;
}
void rightstep(char *str,int step)
{
int i,length,count;
char pt[10];
length = strlen(str); //获取字符串的字符个数
printf("原字符串为:");
for(i = 0;i < length;i++)
{
putchar(str[i]);
}
printf("\n");
count = step % length;
for(i = 0;i < length;i++)
{
pt[(i + count) % length] = str[i];
}
pt[length] = '\0';
printf("移动了%d位的数组为:",step);
for(i = 0;i < length;i++)
{
putchar(pt[i]);
}
printf("\n");
}
void quchong(char *str)
{
int i,j,length,k = 0,tf = 0,m = 0;
int in[10];
char pt[10];
length = strlen(str);
printf("原字符串为:");
for(i = 0;i < length;i++)
{
putchar(str[i]);
}
printf("\n");
for(i = length - 1;i > 0;i--)
{
for(j = i - 1;j >= 0;j--)
{
if(str[i] == str[j])
{
in[k] = j;
k++;
}
}
}
printf("去重后的字符串为:");
for(i = 0;i < length;i++)
{
for(j = 0;j < k;j++)
{
if(in[j] == i)
{
tf = 1;
break;
}
else
{
tf = 0;
}
}
if(!tf)
{
pt[m] = str[i];
//putchar(str[i]);
m++;
}
}
for(i = 0;i < m;i++)
{
putchar(pt[i]);
}
printf("\n");
}
int get_int(void)
{
int in;
printf("请您输入字符串右移的位数:");
while(scanf("%d",&in) != 1)
{
printf("请您重新输入字符串右移的位数:");
}
while(getchar() != '\n')
continue;
return in;
}
运行结果截图:
在这里谢谢各位读者的阅览,如有比较优的解答代码,也希望各位读者提出来,谢谢了。