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;}
运行结果截图:
在这里谢谢各位读者的阅览,如有比较优的解答代码,也希望各位读者提出来,谢谢了。
- 2016年3月5日CVTE网测的两道编程题
- [面经]CVTE的两道笔试编程题
- [面经]CVTE的两道笔试编程题
- CVTE 2017年07月29日 笔试 C/C++ 编程交流
- 2016 CVTE 笔试编程题
- 2016CVTE春招笔试编程题
- 编程随笔【2016年5月16日】
- CVTE编程题(一)
- 分享两道CVTE面试题
- 5月3日
- 2016年7月5日遇到的BUG统计
- 2016年3月16日,开始自己的博客
- 2011年的3月21日
- 2005年5月26日编程重要心得
- 2016年5月5日
- 每天一道笔试题-2012年3月5日
- 2016年5月1日
- 2016年5月20日总结
- 如何赚到互联网的“下一桶金”
- 关于跳槽,是我心浮气躁?还是我确实该离开了?
- 线性表的链式存储及其接口函数C++类实现
- IO小练习
- 麻烦+找规律+各种情况
- 2016年3月5日CVTE网测的两道编程题
- React-Native中this的带给大家的困惑
- mysql中utf8_bin、utf8_general_ci、utf8_general_cs编码区别
- Linux内核分析,完成一个简单的时间片轮转多道程序内核代码
- java学习--内存泄露和内存溢出
- uva 10881(ants)
- table合并单元格colspan和rowspan
- 【ZYNQ-7000开发之十三】中断:私有定时器中断
- 进程与线程的区别(转)