2016年3月5日CVTE网测的两道编程题

来源:互联网 发布:mm下载软件 编辑:程序博客网 时间:2024/04/26 01:08

昨天,也就是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;}

运行结果截图:
这里写图片描述

在这里谢谢各位读者的阅览,如有比较优的解答代码,也希望各位读者提出来,谢谢了。

0 0
原创粉丝点击