牛客题解 | 奶牛编号
1.牛客题解 | 几个岛2.牛客题解 | 分割后处理3.牛客题解 | 分布式集群消息传递4.牛客题解 | 分玩具5.牛客题解 | 分田地6.牛客题解 | 分石头7.牛客题解 | 分苹果8.牛客题解 | 分贝壳9.牛客题解 | 列表补全10.牛客题解 | 删数11.牛客题解 | 删除公共字符12.牛客题解 | 删除重复字符13.牛客题解 | 删除重复字符_114.牛客题解 | 判断一棵满二叉树是否为二叉搜索树15.牛客题解 | 判断题16.牛客题解 | 包裹运输17.牛客题解 | 区间表达18.牛客题解 | 升级蓄水池19.牛客题解 | 单词缩写20.牛客题解 | 卡中心密码安全规范21.牛客题解 | 卡中心美食家22.牛客题解 | 厨艺大赛奖金23.牛客题解 | 友好城市24.牛客题解 | 双素数25.牛客题解 | 双色塔26.牛客题解 | 双袋购物27.牛客题解 | 发奖金28.牛客题解 | 古巴比伦迷宫29.牛客题解 | 句子反转30.牛客题解 | 吃鱼31.牛客题解 | 合唱团32.牛客题解 | 合并区间33.牛客题解 | 合并果子34.牛客题解 | 商品交易35.牛客题解 | 回合制游戏36.牛客题解 | 回文37.牛客题解 | 回文串38.牛客题解 | 回文序列39.牛客题解 | 回文数索引40.牛客题解 | 回文数组41.牛客题解 | 回文素数42.牛客题解 | 图的遍历43.牛客题解 | 图的闭包44.牛客题解 | 地下迷宫45.牛客题解 | 地牢逃脱46.牛客题解 | 地鼠逃跑计划47.牛客题解 | 堆棋子48.牛客题解 | 堆棋子_149.牛客题解 | 塔50.牛客题解 | 外卖满减51.牛客题解 | 多数组中位数52.牛客题解 | 多数组第 K 小数53.牛客题解 | 大家来扫雷54.牛客题解 | 大巴车(数组分块,按块翻转,块内不变)55.牛客题解 | 大数乘法56.牛客题解 | 大整数相乘57.牛客题解 | 头条校招58.牛客题解 | 奇数位丢弃59.牛客题解 | 奖学金
60.牛客题解 | 奶牛编号
61.牛客题解 | 好奇的薯队长62.牛客题解 | 如何添加运算符63.牛客题解 | 字母交换64.牛客题解 | 字母卡片65.牛客题解 | 字母数字混合排序66.牛客题解 | 字符串中找出连续最长的数字串67.牛客题解 | 字符串交错组成68.牛客题解 | 字符串价值69.牛客题解 | 字符串分割70.牛客题解 | 字符串匹配71.牛客题解 | 字符串压缩算法72.牛客题解 | 字符串复制73.牛客题解 | 字符串提取74.牛客题解 | 字符串旋转75.牛客题解 | 字符串是否由子串拼接76.牛客题解 | 字符串替换77.牛客题解 | 字符串替换_178.牛客题解 | 字符串最小变换次数79.牛客题解 | 字符串的排列80.牛客题解 | 字符串的旋转81.牛客题解 | 字符串相乘82.牛客题解 | 字符串组合83.牛客题解 | 字符串计数84.牛客题解 | 字符串距离85.牛客题解 | 字符串连连看86.牛客题解 | 字符串通配87.牛客题解 | 字符串问题88.牛客题解 | 字符混编89.牛客题解 | 字符编码90.牛客题解 | 字符覆盖91.牛客题解 | 字符迷阵92.牛客题解 | 字符迷阵_193.牛客题解 | 字符集合94.牛客题解 | 孙悟空的徒弟95.牛客题解 | 学数学96.牛客题解 | 安置路灯97.牛客题解 | 完成括号匹配98.牛客题解 | 实现字通配符*99.牛客题解 | 密码检查100.牛客题解 | 密码破译题目
题解
题目难度:简单
知识点:数学问题,排序算法
分析:
本题其实考察的是对数组进行排序,第i只奶牛想要一个1和x[i]之间的整数(其中包含1和x[i])。可以先给x[i]最小的奶牛编号,共有x[ i1 ]种方法,然后给第二小的奶牛编号,由于第一小的奶牛已经占用了一个号码,此时第二小的奶牛有(x[i2]-1)种编号方法,以此类推即可,所以编号方法总数为 x[i1](x[i2]-1)(x[i3]-2)*... 。
该问题为排序问题,给出几种常用的方法:
方法1:利用Arrays工具类中sort()函数进行排序
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine()); //奶牛数量
int[] nums = new int[n]; //奶牛们的编号
String str = sc.nextLine();
String[] s = str.split(" ");
for(int i=0;i<n;i++){ nums[i]="Integer.parseInt(s[i]);" } 对数组进行排序 1. 利用java的api对数组进行排序 arrays.sort(nums); long res="res*(nums[i]-i)%1000000007;" for(int i i<n; i++){ system.out.println(res); ``` ## 方法2:冒泡排序 import java.util.arrays; java.util.scanner; public class main { static void main(string[] args) scanner sc="new" scanner(system.in); int n="Integer.parseInt(sc.nextLine());" 奶牛数量 int[] nums="new" int[n]; 奶牛们的编号 string str="sc.nextLine();" string[] s="str.split("" "); 2. 利用冒泡排序 bubblesort(nums); private bubblesort(int[] nums) if(nums="=null" || nums.length<1){ return; len < - 1; 每次都是从下标0位置处开始新一轮的比较 j 1 i; j++){ 升序排序 if(nums[j]>nums[j+1]){
swap(nums,j,j+1);
}
}
}
}
private static void swap(int[] nums, int i, int j) {
int tmp = nums[j];
nums[j] = nums[i];
nums[i] = tmp;
}
}
方法3:选择排序
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine()); //奶牛数量
int[] nums = new int[n]; //奶牛们的编号
String str = sc.nextLine();
String[] s = str.split(" ");
for(int i=0;i<n;i++){ nums[i]="Integer.parseInt(s[i]);" } 对数组进行排序 2. 利用选择排序 selectsort(nums); long res="res*(nums[i]-i)%1000000007;" for(int i i<n; i++){ system.out.println(res); private static void selectsort(int[] nums) { if(nums="=null" || nums.length<1){ return; int len < - 1; j="i+1;" j<len; j++){ if(nums[i]>nums[j]){
swap(nums,i,j);
}
}
}
}
private static void swap(int[] nums, int i, int j) {
int tmp = nums[j];
nums[j] = nums[i];
nums[i] = tmp;
}
}
方法4:插入排序
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine()); //奶牛数量
int[] nums = new int[n]; //奶牛们的编号
String str = sc.nextLine();
String[] s = str.split(" ");
for(int i=0;i<n;i++){ nums[i]="Integer.parseInt(s[i]);" } 对数组进行排序 2. 利用插入排序 insertsort(nums); long res="res*(nums[i]-i)%1000000007;" for(int i i<n; i++){ system.out.println(res); private static void insertsort(int[] nums) { if(nums="=null" || nums.length<1){ return; int len="nums.length;" 下标从1开始 < len; j>= 0 && nums[j]>nums[i]; j--){
swap(nums,i,j);
}
}
}
private static void swap(int[] nums, int i, int j) {
int tmp = nums[j];
nums[j] = nums[i];
nums[i] = tmp;
}
}
方法5:快速排序
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine()); //奶牛数量
int[] nums = new int[n]; //奶牛们的编号
String str = sc.nextLine();
String[] s = str.split(" ");
for(int i=0;i<n;i++){ nums[i]="Integer.parseInt(s[i]);" } 对数组进行排序 2. 利用快速排序 quicksort(nums,0,nums.length-1); long res="res*(nums[i]-i)%1000000007;" for(int i="0;" i<n; i++){ system.out.println(res); private static void quicksort(int[] nums, int low, high) { if(low>=high){
return;
}
int index = partition(nums,low,high);
quickSort(nums, 0, index-1);
quickSort(nums,index+1,high);
}
private static int partition(int[] nums, int low, int high) {
//直接选择第一个当分隔值,不能通过
//int key=nums[low];
// 三个值中选择,增大随机性
int mid=low+(high-low)/2;
if(nums[mid]>nums[high]){
swap(nums,low,high);
}
if(nums[low]>nums[high]){
swap(nums,low,high);
}
if(nums[mid]>nums[low]){
swap(nums,low,high);
}
int key=nums[low];
while(low<high){ while(nums[high]>=key && high>low){ //从后往前找
high--;
}
swap(nums,low,high); //找到之后值进行交换
while(nums[low]<=key && high > low){ // 从前半部分向后扫描
low++;
}
swap(nums,low,high);
}
return low;
}
private static void swap(int[] nums, int i, int j) {
int tmp = nums[j];
nums[j] = nums[i];
nums[i] = tmp;
}
}
【注意】影响快排算法的效率是中心值key的选取,如果直接选择第一个或最后一个作为key值,无法在规定时间内完成所有测试
</high){></n;i++){></n;i++){></n;i++){></n;i++){>
合集:
牛客笔试大厂真题题解2
分类:
牛客笔试大厂真题题解2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】