有N个瓶子,编号 1 ~ N,放在架子上。

比如有5个瓶子:
2 1 3 5 4

要求每次拿起2个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:
1 2 3 4 5

对于这么简单的情况,显然,至少需要交换2次就可以复位。

如果瓶子更多呢?你可以通过编程来解决。

输入格式为两行:
第一行: 一个正整数N(N<10000), 表示瓶子的数目
第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。

输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。

例如,输入:
5
3 1 2 5 4

程序应该输出:
3

再例如,输入:
5
5 4 3 2 1

程序应该输出:
2

**思路:**一开始分析最少次数的交换过程,有点像一个排序,但自身将快排和选择排序记混了导致一开始用递归很沙比的做了一下,实际上要实现最小次数交换,按照选择排序的思想交换就是最小次数


代码:

import java.util.HashMap;
import java.util.Scanner;public class ad2 {static int N;static int[]arr;static int right;//右static int left=1;private static int  ans;public static void main(String[] args) {//十分类似选择排序Scanner scanner=new Scanner(System.in);N=scanner.nextInt();arr = new int[N+1];right=arr.length-1;for (int i = 1; i < arr.length; i++) {arr[i]=scanner.nextInt();}while (left<=N){int maxindex=0;for (int i = left+1; i < arr.length; i++) {if (arr[i]<arr[left]){maxindex=Math.max(maxindex,i);}}if (maxindex!=0) {swap(maxindex, left);}left++;}System.out.println(ans);for (int i = 1; i < arr.length; i++) {System.out.print(arr[i]);}}private static void swap(int i,int k) {int temp=arr[i];arr[i]=arr[k];arr[k]=temp;ans++;}
}

下面是第一次做的sb代码:我真的要笑死我自己了,递归学的还行(晕了@@@@)
有点像深搜:时间复杂度直接指数级别

import java.util.Scanner;public class ad {static int N;static int[]arr;static int right;//右static int left=1;private static int  ans;public static void main(String[] args) {// TODO 自动生成的方法存根Scanner scanner=new Scanner(System.in);N=scanner.nextInt();arr = new int[N+1];right=arr.length-1;for (int i = 1; i < arr.length; i++) {arr[i]=scanner.nextInt();}int core=arr[1];swapnum(core,"l");System.out.println(ans);System.out.println("--------------");for (int i = 1; i < arr.length; i++) {System.out.print(arr[i]);}}private static void  swapnum(int core,String flag) {// TODO 自动生成的方法存根//k为下标//先左后右,找不到就固定if (left>right) {return ;}if (flag=="l") {//从左开始for (int i = left+1; i < arr.length; i++) {if (left>right) {return ;}if (arr[i]>core&&arr[i-1]<core&&i!=arr.length-1) {//找到比core值大的swap(i-1, left);swapnum(arr[right],"r");}else if (arr[i]>core&&i==arr.length-1){left++;swapnum(arr[right],"r");}else if (arr[i]<core&&i==arr.length-1){//从左向右变量需要考虑找不到比首元素大的特殊情况swap(i, left);swapnum(arr[right], "r");}}}if (flag=="r") {//从右开始//这时候right是leftfor (int i = right-1; i >=1; i--) {if (left>right) {return ;}if (arr[i]<core&&arr[i+1]>core) {//找到比core小的,没找到,不用换swap(right, i+1);swapnum(arr[left],"l");}else if (arr[i]<core&&i==1){right--;swapnum(arr[left],"l");}}}}private static void swap(int i, int k) {// TODO 自动生成的方法存根int temp=arr[i];arr[i]=arr[k];arr[k]=temp;ans++;}
}

交换瓶子-JavaA相关推荐

  1. 1720: 交换瓶子

    1720: 交换瓶子 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次 ...

  2. 交换瓶子(蓝桥杯入门)

    交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的 ...

  3. java实现第七届蓝桥杯交换瓶子

    交换瓶子 交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于 ...

  4. 交换瓶子(蓝桥杯真题)

    交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的 ...

  5. 蓝桥杯-【交换瓶子】【2016年省赛B组题解】【C++】

    2016年第七届蓝桥杯题目汇总 http://blog.csdn.net/qq_34202873/article/details/79646517 第九题: 交换瓶子 有N个瓶子,编号 1 ~ N,放 ...

  6. 蓝桥杯2016年C语言B组-交换瓶子

    蓝桥杯2016年C语言B组 交换瓶子 代码 交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的 ...

  7. 蓝桥杯 交换瓶子 Java实现

    交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的 ...

  8. 1224. 交换瓶子

    1224. 交换瓶子 暴力解法: 题解 这种暴力解法长得很像选择排序. 选择排序是分为1 ~ i的有序区 i+1 ~ n的无序区.在无序区中找一个最小的,然后放入无序区的第一个位置. 这个题也是这样, ...

  9. 【Code Pratice】—— 猜字母、次数差、交换瓶子

    文章目录 1 | 猜字母 题目 思路 逻辑代码 2 | 次数差 题目 思路 逻辑代码 3 | 交换瓶子 题目 思路 逻辑代码 1 | 猜字母 题目 把abcd-s共19个字母组成的序列重复拼接106次 ...

最新文章

  1. Redis的持久化机制-RDB方式和AOF方式
  2. 全志 移除屏幕超时选项 Patch
  3. oracle 双引号替换,oracle - Oracle SQL-Loader在值中有效地处理内部双引号 - SO中文参考 - www.soinside.com...
  4. mybatis多产数_freeCodeCamp杰出贡献者–我们如何选择,认可和奖励多产的志愿者
  5. Linux下记住Gitee账户密码
  6. 设置Eclipse自带Ant指定版本JDK和运行时参数
  7. Sublime Text:安装插件、卸载插件
  8. factoryreset恢复出厂设置测试
  9. f5计算机中代表什么,ctrl f5是什么意思
  10. 计算机组成原理第三部: 总线与IO系统
  11. c语言实验作业在dev蜗居的思路,关于C语言的问题:如何用C语言实现n阶行列式和矩阵的值...
  12. 【人工智能】1.问题求解:启发式搜索算法
  13. 惠普p1106打印机安装步骤_hp1106打印机安装驱动下载
  14. 华为手机安卓手机莫名其妙的闹钟不知道哪里来的
  15. HDU3507打印文章 斜率优化入门
  16. DiskGenius 百度云下载链接
  17. 无胁科技-TVD每日漏洞情报-2022-11-29
  18. H5之外部浏览器唤起微信分享
  19. 找到年龄最大的人,并输出
  20. 从python菜鸟到kaggle_Kaggle首次定义数据科学家:30岁,年薪5万刀,爱Python,最恨脏数据-阿里云开发者社区...

热门文章

  1. [ C语言 ] 类型转换与输出识别
  2. 基于OpenCVSharp的图像处理软件
  3. Hibernate学习(一)
  4. super()和super(props)的区别以及为什么要写super(props)
  5. 大学生计算机专业英文求职,计算机专业大学生英文求职信范文
  6. Windows 家族吐槽大会
  7. 探索STM32F407ZET6,全套设计资料,包含原理图
  8. 【基础试题】输出如下图形 Time Limit:1000MS Memory Limit:65536K Total Submit:604 Accepted:384 Description   输
  9. r5 5500u和r7 5700u哪个好 r55500u和r75700u区别有多大
  10. 整了半天终于把五笔整出来了