精华内容
下载资源
问答
  • 比较交换时需要先“将当前这两个元素进行全排列拼接”,使用拼接后的两个新值进行比较, 例如:11和13全排列后的新值就为1113和1311 2、将排好序的数组中的元素拼接成字符串输出 PS:如果输出最小值,只需...

    题意:
    即将数组[12,14,11,9]中的四个整数全排列拼接成一个个新的数值,最后输出最大的那个数值
    思路:
    1、因为要的是最大值,所以使用冒泡排序将数组元素按照大到小的顺序进行排列,
    比较交换时需要先“将当前这两个元素进行全排列拼接”,使用拼接后的两个新值进行比较,
    例如:11和13全排列后的新值就为1113和1311
    2、将排好序的数组中的元素拼接成字符串输出

    PS:如果输出最小值,只需要将冒泡排序按照小到大的顺序排列即可

    /**
         * 思路:
         * 1、因为要的是最大值,所以使用冒泡排序将数组元素按照大到小的顺序进行排列,
         * 比较交换时需要先“将当前这两个元素进行全排列拼接”,使用拼接后的两个新值进行比较,
         * 例如:11和13全排列后的新值就为1113和1311
         * 
         * 2、将排好序的数组中的元素拼接成字符串输出
         * @param args
         */
        public static void main(String[] args) {
            Scanner scanner=new Scanner(System.in);
            System.out.println("请输入数组长度:");
            int [] arr=new int[scanner.nextInt()];
    
            System.out.println("请输入"+arr.length+"个数组元素:");
            for (int i = 0; i <arr.length ; i++) {
                arr[i]=scanner.nextInt();
            }
    
            //使用冒泡排序将数组元素按照从大到小的顺序排
            for (int i = 0; i < arr.length; i++) {
                for (int j = i + 1; j < arr.length; j++) {
                    // 把两个int类型的数组元素拼接成字符串,再将拼接后的字符串转换成int方便比较大小
                    int a = Integer.valueOf(arr[i] + "" + arr[j]);
                    int b = Integer.valueOf(arr[j] + "" + arr[i]);
                    if (a < b) {
                        int t = arr[i];
                        arr[i] = arr[j];
                        arr[j] = t;
                    }
                }
            }
    
            String str = "";
            for (int i = 0; i < arr.length; i++) {
                str += String.valueOf(arr[i]);
            }
            System.out.println("数组元素组成的最小值:"+str);
        }
    
    展开全文
  • 拼接后的大的结果放到前面。 function findTheMax($arr) { $size = count($arr); if ($size <= 1) { return $arr; } $mid = ceil(($size - 1) / 2); $left = array_slice($arr, 0, $mid); $right ...

    思路:跟普通的排序算法不同的是,排序的规则的调整。需要拼接两个字符串并比较大小。将拼接后的大的结果放到前面。

     

     

    function findTheMax($arr)
    {
        $size = count($arr);
        if ($size <= 1) {
            return $arr;
        }
        $mid = ceil(($size - 1) / 2);
        $left = array_slice($arr, 0, $mid);
        $right = array_slice($arr,$mid);
    
        return merge(findTheMax($left), findTheMax($right));
    }
    
    function merge($a, $b)
    {
        $asize = count($a);
        $bsize = count($b);
        $i = $j  = $k = 0;
        $arr = [];
        while ($i < $asize && $j < $bsize) {
        	$a1 = $a[$i] . $b[$j];
        	$b1 = $b[$j] . $a[$i];
        	if ($a1 > $b1) {
        		$arr[$k++] = $a[$i++];
        	} else {
        		$arr[$k++] = $b[$j++];
        	}
        }
    
        if ($i < $asize) {
        	$arr[$k++] = $a[$i++];
        }
        if ($j < $bsize) {
        	$arr[$k++] = $b[$j++];
        }
        return $arr;
    }
    $arr = [3,11,2,4, 230, 2];
    var_dump(findTheMax($arr));

     

    展开全文
  • 将n个正整数(最多三位)连接组成一个最大的数 输入: 5 45 67 98 29 291 输出: 98674529291 思路(以上面测试用例为准): 1.错误方法: 首先我想到的是将这5个整数根据字符进行排序,再将排序的结果...

    题目描述:

    将n个正整数(最多三位)连接组成一个最大的数

    输入:

    5

    45 67 98 29 291

    输出:

    98674529291

    思路(以上面测试用例为准):

    1.错误方法:

    首先我想到的是将这5个整数根据字符进行排序,再将排序后的结果连接起来,就组成了一个最大值,但是这种方法是错误的,如下:

    使用Arrays.sort()进行排序

    45 67 98 29 291的排序结果为98 67 45 291 29

    组合起来的数就是98674529129

    显然是比98674529291要来的小,只能通过一部分的测试用例,如同29 291这样的就会出现错误

    2.改进方法:

    改进思路:

    既然有29 291类似的会出错,那么就想办法把29排在291前面

    创建一个二维数组:

    第一行为那n个正整数

    第二行数的规则为:

    for (int i=n-1;i>=0;i--) {
    strmiddle[i][0] = Integer.parseInt(str[i]);
    if(str[i].length()==1){
    strmiddle[i][1] = Integer.parseInt(str[i]+str[i].charAt(0)+str[i].charAt(0));
    }
    if(str[i].length()==2){
    strmiddle[i][1] = Integer.parseInt(str[i]+str[i].charAt(0));
    }
    if(str[i].length()==3){
    strmiddle[i][1] = Integer.parseInt(str[i]);
    }
    }
    

      

    即有下面二维数组:

    45   67   98   29   291

    454 676 989 292 291

    转化规则如下面例子:

    若arr[0][i] = 4,那么arr[1][i] = 444

    若arr[0][i] = 54,那么arr[1][i] = 545

    若arr[0][i] = 789,那么arr[1][i] = 789

    然后再根据第二行的数进行排序,再将第一行的数连接起来就是最大的数

    即98674529291

    3.错误以及进一步改进:

    依然存在问题

    对于53 535两个数,转化的数都为535,显然535应该排在53前面

    所以先对二维数组第一行使用Array.sort()进行排序

    再对数组第二行使用稳定的排序(冒泡排序等)或者再次使用重写的Array.sort()(经过测试也是稳定的,@override代码如下)

    Arrays.sort(strmiddle,new Comparator<Integer[]>() {
    @Override
    public int compare(Integer[] x, Integer[] y) {
    if(x[1] < y[1]){
    return 1;
    } else if(x[1] >= y[1]){
    return -1;
    } else {
    return 0;
    }
    }
    });
    

      

    再将第一行得数按顺序拼接起来就是最大的数

    4.具体代码如下:

    package test;
    
    import java.util.Arrays;
    import java.util.Comparator;
    import java.util.Scanner;
    
    public class Nums {
    public static void main(String args[]) {
    @SuppressWarnings("resource")
    Scanner scan = new Scanner(System.in);
    System.out.println("请输入n:");
    int n = scan.nextInt();
    int [] num = new int[n];
    String []str = new String[n]; 
    Integer [][]strmiddle = new Integer[n][2];
    System.out.println("请输入"+n+"个整数:");
    for (int i=0;i<n;i++) {
    num[i] = scan.nextInt();
    //将int转化为string
    str[i] = String.valueOf(num[i]);
    }
    Arrays.sort(str);
    StringBuffer result = new StringBuffer("");
    System.out.println("排序结果为:");
    
    for (int i=n-1;i>=0;i--) {
    System.out.print(str[i]+" ");
    strmiddle[i][0] = Integer.parseInt(str[i]);
    if(str[i].length()==1){
    strmiddle[i][1] = Integer.parseInt(str[i]+str[i].charAt(0)+str[i].charAt(0));
    }
    if(str[i].length()==2){
    strmiddle[i][1] = Integer.parseInt(str[i]+str[i].charAt(0));
    }
    if(str[i].length()==3){
    strmiddle[i][1] = Integer.parseInt(str[i]);
    }
    }
    
    Arrays.sort(strmiddle,new Comparator<Integer[]>() {
    @Override
    public int compare(Integer[] x, Integer[] y) {
    if(x[1] < y[1]){
    return 1;
    } else if(x[1] >= y[1]){
    return -1;
    } else {
    return 0;
    }
    }
    });
    
    System.out.println("\nstrmiddle[][]:");
    for (int i=0;i<n;i++) {
    System.out.print(strmiddle[i][0]+" ");
    System.out.print(strmiddle[i][1]+"\n");
    result.append(strmiddle[i][0]);
    }
    
    System.out.println("最终结果为:\n"+result);
    }
    }

     

    5.执行结果如下:

     

    转载于:https://www.cnblogs.com/fanghuiplus/p/9448290.html

    展开全文
  • ACM 整数接力问题

    2018-07-19 09:23:05
    Problem Description ...编程任务:对于给定的n个正整数,请找出一种最佳的接力方式,使得采用该接力方式得到的正整数最大。 Input 第1行是一个正整数n(0&lt;n&lt;=10000),接下来有n行...

    Problem Description

    所谓整数接力是指将n个正整数前后拼接成一个数。不同的接力方式将得到不同的结果。例如n=3时,3个正整数1,2,3的接力结果有:123,132,213,231,312,321。
    编程任务:对于给定的n个正整数,请找出一种最佳的接力方式,使得采用该接力方式得到的正整数最大。

    Input

    第1行是一个正整数n(0<n<=10000),接下来有n行,每行1个参与接力的非负整数m(0<=m<2^31),n个整数不全为0.

    Output

    通过接力得到的最大正整数

    Sample Input

    3
    1
    2
    3
    

    Sample Output

    321

    Author

    tianzuwei

    思考:为求最大的数,那么也就是要把数字大的数放在前面,小的放在后面就可以了,数字大是指单个位(个十百千万)大的放在前面就可以了。我采用的失字符串形式,所以排序规则是,首先字典序排序,注意的地方就是当假设A串是B串的“子串” 这种形式A(1234) B(12344565) 不是A(1234) B(231234);是A串再B串的前面。这个时候,要以B串除开A串之后的部分为新串和A串比较,一次类推,一直得到A和B的大小。

    程序:

    #include<bits/stdc++.h>
     
    using namespace std;
     
    bool cmp(string str1, string str2)
    {
        int len1 = str1.length();
        int len2 = str2.length();
        int i, j;
        for(i = 0, j = 0; i < len1 || j < len2; i++,j++)
        {
            if(i == len1 && j < len2) i = 0;
            if(i < len1 && j == len2) j = 0;
            if(str1[i] > str2[j]) return 1;
            else if(str1[i] == str2[j]) ;
            else return 0;
        }
        return 0;
    }
     
    int main()
    {
       // freopen("in.txt","r",stdin);
        string str[101];
        int n;
        while(cin >> n)
        {
            int i;
            for(i = 0; i < n; i++)
            {
                cin >> str[i];
            }
            sort(str,str+n,cmp);
            for(i = 0; i < n; i++)
            cout << str[i];
            cout << endl;
        }
        fclose(stdin);
        return 0;
    }

    展开全文
  • 构造最大

    2020-12-21 15:55:41
    给定一个只包含正整数的数组,给出一个方法,将数组中的数拼接起来,使得拼接后的数最大。例如,[1, 32,212]拼接之后,所得到的最大数为322121。 基本思路: 按照字典从小到大的顺序排序,如果出现一个是另一个字符...
  • (算法)构造最大

    2015-09-30 11:13:00
    给定一个只包含正整数的数组,给出一个方法,将数组中的数拼接起来,使得拼接后的数最大。例如,[1, 32, 212]拼接之后,所得到的最大数为322121。 思路: 比较方法:两个数先后顺序的确定,如a,b,如果ab>ba...
  • 基本思想:排序,将先将nums中数字转为字符串保存到ans,然后对ans排序,排序算法是将两个字符串正反拼接后比较大小,这正好是题目所要求的返回最大拼接的字符串。 解法二: 基本思想:暴力,用二维数组vec保存...
  • 第一题: 一个性质:如果 str1 和 str2 拼接后等于 str2和 str1 拼接起来的字符串(注意拼接顺序不同),那么一定存在上述条件...欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。应用领域有...
  • uva10905-Children's Game

    2013-08-19 10:47:40
    题目大意:给你n个正整数,求将这n个整数重新组合组成的最大正整数。例:给定n个正整数分别为:90,901 ,89.这三个正整数共有6种组合方法最大的为(9090189)结果输出这个数。 题目思路:本题就是一个字符串排序...
  • 2020-08-11

    2020-08-11 15:01:48
    百度开发测试工程师一面 1.MySQL的四大特性是什么? 2.OSI七层协议 3.TCP三次握手和四次挥手的具体过程,为什么握手...(3)输入一个正整数数组,把数组中所有整数拼接成一个数,打印拼接后的所有数字中的最大值。 ...
  • 题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 思路:若数组中的数位数都...
  • 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最 小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 用Java的比较器,比较两个字符最大的...
  • UVa 10905 - Children's Game

    2013-07-21 10:21:00
    题目大意:给n个正整数,对这n个数进行拼接,共有n!种方案(在n个数互不相同的情况下),找出其中最大拼接数。如123,124,结果为124123。  开始考虑用字典序,不过这在两个数长度相同时正确,在长度不同时就出...
  • 洛谷——P6298 齿轮

    2020-10-10 16:23:51
    Daniel13265 从不知哪里找来了 nn 个齿轮,第 ii 个齿轮的齿数为不超过 mm 的正整数 a_ia i ​ 。他现在想把其中 kk 个齿轮按照一定的方式拼接在一起。 当齿轮使用一段时间,就会产生损耗。一个齿轮组的损耗速率...
  • 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3、32、321},则打印321323。 最直接的做法:先求出这个数组中所有数字的全排列,然后把每个排列拼...
  • 3.3.7 实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去。 3.3.8 找到满足条件的数组 3.3.9 一个大的含有50M个URL的记录...
  • javascript入门笔记

    2018-05-15 15:01:07
    将数字转换为二进制进行运算 只做整数运算,如果是小数的话,则去掉小数位再运算 2、位运算 1、按位 与 :& 语法 :a & b 特点 :将 a 和 b 先转换为二进制,按位比较,对应位置的数字都为1的话,那么该位的...
  • 最大最小值求剩余数组平均值.cmd 反序列出文本的每行内容.cmd 反序显示输入内容.cmd 取得硬盘数.bat 变色+翻滚字符.bat 变色+翻滚字符.cmd 变量截取实例.bat 变量的多级嵌套.bat 变量的多级嵌套.cmd 只修改年份...
  • 最大最小值求剩余数组平均值.cmd 对数字进行排序.cmd 把一个数拆分为几个数的和.cmd 无限制实数加减运算脚本.cmd 显示随机的5个数.cmd 水仙花数算法.cmd 求一列数所有不同组合的和.cmd 求最大公约数和...
  • 最大最小值求剩余数组平均值.cmd 对数字进行排序.cmd 把一个数拆分为几个数的和.cmd 无限制实数加减运算脚本.cmd 水仙花数算法.cmd 求一列数所有不同组合的和.cmd 求最大公约数和最小公倍数.cmd 用随机数做四则...
  • 清洗: 【#赵薇#:筹备下一部电影 但不是青春片.... 清洗邮箱 原: 我的邮箱是abc@demo.com,欢迎联系 清洗: 我的邮箱是,欢迎联系 URL转正常字符 原: www.%E4%B8%AD%E6%96%87%20and%20space.com 清洗: ...
  • 九章算法面试题35 构造最大

    千次阅读 2015-05-12 14:43:30
    给定一个只包含正整数的数组,给出一个方法,将数组中的数拼接起来,使得拼接后的数最大。例如,[1, 32, 212]拼接之后,所得到的最大数为322121。

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

最大正整数拼接后