目录
近几年互联网受疫情影响,许多互联网都使用牛客网在线笔试招人
很多同学因为不熟悉牛客网的环境和使用,最后在线笔试面试中屡屡受挫
牛客网提供了语言巩固,算法提高等在线OJ题,更有面试真题,大厂内推!
链接附上点击链接注册牛客网
- #include
- int main()
- {
- int n=0;
- while(~scanf("%d",&n))
- {
- //上半部分n+1行
- for(int i=1;i<=n+1;i++)
- {
- //空格
- for(int j=1;j<=n+1-i;j++)
- {
- printf(" ");
- }
- //星号
- for(int j=1;j<=i;j++)
- {
- printf("*");
- }
- printf("\n");
- }
-
- //下半部分n行
- for(int i=1;i<=n;i++)
- {
- //空格
- for(int j=1;j<=i;j++)
- {
- printf(" ");
- }
- //星号
- for(int j=1;j<=n+1-i;j++)
- {
- printf("*");
- }
- printf("\n");
- }
-
- }
- return 0;
- }
这题的启示:
可以把两个空格作为一次性输出,只要for循环里的判断条件你好写,怎么样都行!!
学习到牛客网:原来可以通过鼠标可以查看空格有多少个!!!
我的做题感悟:
- #include
- int main()
- {
- int score=0;//分数(整数)
- int max=0;
- int min=100;//最小值先给最大的
- int count=0;//计数器,7个一组
- int sum=0;//7个整数的和
- while(scanf("%d",&score)!=EOF)//一次输入一个
- {
- if(max
max=score; - if(min>score) min=score;
- sum+=score;
- count++;
- if(count==7)//7个为一组,够了7个重新初始化
- {
- printf("%.2lf\n",(sum-min-max)/5.0);//格式输出:换行
- max=0;
- min=100;
- sum=0;
- count=0;
- }
- }
- return 0;
- }
这题的提示:
对于多组输入,且是一组输入多个数据,可能大多数人想到的做法是:对于每一组数据一次性输完
但是这样即不美观,当数据多了就...
题目:
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
- #include
- void LeftRound(char* str, int k)
- {
- int len = strlen(str);
- k = k%len;
- for (int i = 0; i < k; i++)
- {
- char temp = str[0];
- for (int i = 1; i <= len - 1; i++)
- {
- str[i - 1] = str[i];
- }
- str[len - 1] = temp;
- }
- }
-
- int main()
- {
- char str[20] = "hello world";
- int k = 0;
- scanf("%d", &k);
- LeftRound(str, k);
- printf("%s\n", str);
- return 0;
- }
启发:
k=k%len;提高效率
- #include
- void LeftRound(char* str, int k)
- {
- int len = strlen(str);
- k = k % len;
- char* temp = (char*)malloc(sizeof(len + 1));
- if (temp == NULL)
- {
- perror(temp);
- return -1;
- }
- strcpy(temp, str + k);
- strncat(temp, str, k);
- strcpy(str, temp);
- }
- int main()
- {
- char str[20] = "hello world";
- int k = 0;
- scanf("%d", &k);
- LeftRound(str, k);
- printf("%s\n", str);
- return 0;
- }
- void Rotate(char* str, int left, int right)
- {
- while (left < right)
- {
- char temp = str[left];
- str[left] = str[right];
- str[right] = temp;
- left++;
- right--;
- }
- }
-
- void LeftRound(char* str, int k)
- {
- int len = strlen(str);
- k = k % len;
- Rotate(str, 0, k - 1);
- Rotate(str, k, len - 1);
- Rotate(str, 0, len - 1);
- }
-
- int main()
- {
- char str[20] = "hello world";
- int k = 0;
- scanf("%d", &k);
- LeftRound(str, k);
- printf("%s\n", str);
- return 0;
- }
rotate:旋转
reverse:反转
本题涉及到<数组元素,出现次数>之间的对应映射关系,这种方法应该不难想到,把数组元素出现的次数存到一个标记数组map里,然后遍历一遍map标记数组,找到次数>half的元素就行!
- int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) {
- // write code here
- int map[10000]={0};
- int half=numbersLen/2;
- for(int i=0;i
- {
- map[numbers[i]]++;
- }
- for(int i=0;i
- {
- if(map[numbers[i]]>half)
- {
- return numbers[i];
- }
- }
- return 0;
- }
时间复杂度:O(n)
空间复杂度:O(1)
方法2:排序中值法
由于题目给定输入的数组"一定非空",也就是numbersLen>=1,还给定"且保证有解",那么数组中一定存在一个出现次数超过一半的数组元素。
那么如果我们给数组先进行排序,然后取排完序的数组的中间元素,那一定就是目标值!
也就是快速排序+返回numbers[mid]的代码,简单!不写!
有人可能又要问数组元素取numbers[mid]的时候是否要分奇偶,不需要!(因为蓝色标注)
时间复杂度:O(nLogN)
空间复杂度:O(1)
方法3:消除异值法
只要我们把数组元素不同的两个值给消除掉,因为一定存在一个次数超过数组一半的元素,
所以最后留下来的那个数组值一定是目标值!
- int MoreThanHalfNum_Solution(int* numbers, int numbersLen ) {
- if(numbers==NULL) return -1;
- int time=1;
- int target=numbers[0];
- for(int i=1;i
- {
- if(time==0)
- {
- target=numbers[i];
- time=1;
- continue;
- }
- if(target==numbers[i])
- {
- time++;
- }
- else
- {
- time--;
- }
- }
- return target;
- return 0;
- }
题目做的不过瘾,再来几道?牛客网
-
相关阅读:
【英语阅读】
[RK3568 Android11] Binder驱动结构体
MYSQL:索引与锁表范围简述
数仓主题域和数据域、雪花模型,星型模型和星座模型
为DuiLib的Edit控件增加PlaceHolderText
C++ 继承详解
新版mmdetection3d将3D bbox绘制到图像
Python数据分析----Numpy介绍与安装
Docker 的基本概念和优势
编译原理实验三、 词法分析实验报告
-
原文地址:https://blog.csdn.net/qq_64428099/article/details/125852123