A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jx5785749 中级黑马   /  2015-7-8 22:55  /  737 人查看  /  17 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

面试题:随机给出一个数组,要求你把越靠近50的数往左排;

        public static void main(String[] args) {

                int[] arr = { 1, 2, 4, 7, 9, 12, 2, 3, 4, 89, 100, 105, 88, 50, 49, 48,
                                48, 47, 99, 60, 40, 30, 70 };

                // int[] arr= {1,4,5,7,8,22,44};
                arr = sort50(arr);

                System.out.println(Arrays.toString(arr));

        }

        public static int[] sort50(int[] arr) {
                // 从小到大排
                Arrays.sort(arr);

                /*
                 * 如果数组里面所有的数都大于50
                 */
                if (arr[1] >= 50) {
                        return arr;
                        /*
                         * 如果数组里面所有的数都小于50
                         */
                } else if (arr[arr.length - 1] <= 50) {
                        int[] arrtemp = new int[arr.length];
                        for (int i = 0; i < arr.length; i++) {
                                arrtemp[arr.length - 1 - i] = arr[i];
                        }

                        return arrtemp;
                        /*
                         * 如果数组里面有大于50的也有小于50的
                         */
                } else {

                        // 外循环控制次数
                        for (int x = 0; x < arr.length - 1; x++) {
                                // 内循环控制每一次的比较过程
                                /*
                                 * 第一次,所有元素都参与比较,也就是0个元素不参与。 第二次,有1个元素不用参与。 第三次,有2个元素不用参与。 ...
                                 */
                                // -1是为了防止索引越界
                                // -x是为了减少比较的次数
                                for (int y = 0; y < arr.length - 1 - x; y++) {
                                        if (Math.abs(arr[y] - 50) > Math.abs(arr[y + 1] - 50)) {
                                                // 数据交换
                                                int temp = arr[y];
                                                arr[y] = arr[y + 1];
                                                arr[y + 1] = temp;
                                        }
                                }
                        }

                        /*// 选择排序法
                        for (int i = 0; i < arr.length - 1; i++) {
                                for (int j = i + 1; j < arr.length; j++) {
                                        if (Math.abs(arr[i] - 50) > Math.abs(arr[j] - 50)) {
                                                int temp = arr[j];
                                                arr[j] = arr[i];
                                                arr[i] = temp;
                                        }
                                }
                        }*/

                }
                return arr;
        }

17 个回复

倒序浏览
思路非常给力,谢谢了啊。。
回复 使用道具 举报
杨基米德 来自手机 中级黑马 2015-7-9 06:42:57
藤椅
已然将冒泡排序发扬光大了~
回复 使用道具 举报
第一想法想到的是选择法...没想到上面那些
回复 使用道具 举报
最近几天看视频头晕得很,不想写代码了。。。能说一下我的思路么
先创建一个同样宽度的数组arr1,记录arr1【i】=(arr【i】-50)(arr【i】-50)的值
然后对arr1【i】进行排序,在arr1【x】与arr1【y】交换位置的时候,arr【x】和arr【y】也交换位置
不知道这样会不会简单点
回复 使用道具 举报
很给力 赞一个!!!
回复 使用道具 举报
不错的啊
回复 使用道具 举报
思路清晰,注释也很到位啊,涨知识了
回复 使用道具 举报
楼主写的不错,长知识了
回复 使用道具 举报
本帖最后由 fmi110 于 2015-7-9 10:06 编辑

/*我的思路
1、将数组每个元素减 50  arr = arr-50 ;
        则问题可转换为普通的排序问题

2、将arr的元素按绝对值从小到大排序
    void  swap(int[] arr,int i,int j)
        {
                if( Math.abs(arr) > Math.abs(arr[j]) )
                {
                        int temp = arr;
                        arr = arr [j];
                        arr[j] = temp;
                }
        }
3、将排序后的数组每个元素加上50,arr = arr+50;
则越靠近50的数就越靠左

*/
  1. <span style="font-style: normal;">class  Sort
  2. {
  3.          static void  swap(int[] arr,int i,int j)  //交换数值,绝对值小的在左边
  4.         {
  5.                 if( Math.abs(arr[i]) > Math.abs(arr[j]) )
  6.                 {
  7.                         int temp = arr[i];
  8.                         arr[i] = arr [j];
  9.                         arr[j] = temp;
  10.                 }
  11.         }

  12.         static void printArr(int[] arr)  //定义函数打印数组
  13.         {
  14.                 for(int i = 0; i < arr.length ; i++)
  15.                 {
  16.                          System.out.print(arr[i]+"  ");
  17.                 }
  18.                 System.out.println();
  19.         }

  20.         public static void main(String[] args)
  21.         {
  22.                  int[] arr = { 1, 2, 4, 7, 9, 12, 2, 3, 4, 89, 100, 105, 88, 50, 49, 48,
  23.                                 48, 47, 99, 60, 40, 30, 70 };

  24.                 System.out.println("排序前数组:");

  25.                 printArr(arr); //输出数组

  26.                 for(int i = 0 ; i < arr.length-1 ; i++)
  27.                         arr[i] -= 50 ;                                //每个元素减50

  28.                 for(int i = 0 ; i < arr.length-1 ; i++)
  29.                 {
  30.                         for(int j = i+1 ; j < arr.length; j++)
  31.                         {
  32.                                 swap(arr,i,j);
  33.                         }
  34.                 }

  35.                
  36.                 for(int i = 0; i < arr.length ; i++)
  37.                 {
  38.                          arr[i] = arr[i] + 50;      //将数组值还原
  39.                 }

  40.                 System.out.println("排序后数组:");
  41.                 printArr(arr); //输出数组
  42.                
  43.         }
  44. }
  45. </span>
复制代码

排序.png (5.8 KB, 下载次数: 13)

排序结果

排序结果
回复 使用道具 举报
wunairensheng95 发表于 2015-7-9 08:31
最近几天看视频头晕得很,不想写代码了。。。能说一下我的思路么
先创建一个同样宽度的数组arr1,记录arr1 ...

看我的代码 跟你思路差不多
回复 使用道具 举报
wunairensheng95 发表于 2015-7-9 08:31
最近几天看视频头晕得很,不想写代码了。。。能说一下我的思路么
先创建一个同样宽度的数组arr1,记录arr1 ...

还是会用到排序的。楼主的思路容易理解点
回复 使用道具 举报
不错不错
回复 使用道具 举报
楼主你好。请问这个面试题是入学考试的面试题吗?如果是,那要求马上给出思路么 还是给2分钟思考啊
回复 使用道具 举报
慕容旺财 发表于 2015-7-9 19:29
楼主你好。请问这个面试题是入学考试的面试题吗?如果是,那要求马上给出思路么 还是给2分钟思考啊 ...

我也很想知道
回复 使用道具 举报
慕容旺财 发表于 2015-7-9 19:29
楼主你好。请问这个面试题是入学考试的面试题吗?如果是,那要求马上给出思路么 还是给2分钟思考啊 ...

看我论坛级数!就知道我也是个菜鸟了!我也不怎么清楚!只是做着看看 分享下!:)
回复 使用道具 举报
感谢分享
回复 使用道具 举报
加油加油一起加油!!!!!!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马