算法题:整数排成一排求最大值

算法题:整数排成一排求最大值

题目描述

【编程题】丈母娘的考验
题目ID:1136
【问题描述】小豪和女友恋爱数年,终于要修成正果了。今天,他将以准女婿的身份去女友家,唉呀,忐忑不安。
丈母娘一见小豪,嗯嗯,果然是传说中的高富帅,不错不错!
额额额,等会,这孩子不会是红漆马桶吧?长得好看,可是一肚子的粑粑o(^▽^)o,那可配不上我家宝贝乖乖女儿哦。
“小豪,好孩子,能帮阿姨一个忙吗?老年大学有一道题,我还不会呢。”
原来是这样的一道题:有三个正整数,将其连成一排,求最大的数。
例如,5,6,7,最大数为765;又如33,444,5,最大数为544433
你能帮小豪做出这道题吗?使得小豪能通过丈母娘的考验,迎娶白富美,走上人生巅峰。
【输入形式】三个正整数i,j,k(1<=i,j,k<=30000)
【输出形式】最大数
【样例输入】

【测试用例】
1)
输入:
65 654 6543
输出:
656546543

2)
输入:
12 123 1234
输出:
123412312

3)
输入:
123 32 51
输出:
5132123

4)
输入:
87 234 43
输出:
8743234

5)
输入:
234 355 1987
输出:
3552341987

思路分析

  • 首先想到的是以int类型存储,取每个数的第一位,进行对比,然后进行冒泡排序,输出,假如第一位相同呢,不是还得对比第二位吗,第二位也同呢不是还得对比第三位吗,太过麻烦,不可行(x)
  • 然后可以想到以字符串的类型进行存储,利用string.h中的strcmp函数进行对比,就可以解决对比完第一位还得对比第二位第三位的麻烦问题了,例如对比234和355,可对比出355是大于234的,但是新的问题又出现了,这个数字的位数是不固定的,strcmp函数对比的结果不一定是正确的,例如65和654,strcmp直接对比出的是654大,而我们要的是排列顺序是65654,而不是65465
  • 为了解决这个难题,我们可以采用先合并再对比的方法取正确的值,也就是如果字符串A+B>B+A,则A的优先级比较高,A应该放在前面,例如65和654,65654比65465的strcmp值大,则65应该先输出.

代码描述

#include<stdio.h>
#include<string.h>
int main()
{
   char a[3][6];            //定义二维数组,以行保存字符串
   int i;
   for (i=0;i<3;i++){
       scanf("%s",&a[i]);       //按行读入字符串
   }
   int j;
    for (i=0;i<3;i++){
        for (j=0;j<3-i-1;j++){          //j多减1,防止数组越界
            char tema[12],temb[12];       //临时数组保存要比较的值
            strcpy(tema,a[j]);
            strcat(tema,a[j+1]);
            strcpy(temb,a[j+1]);
            strcat(temb,a[j]);
            if (strcmp(tema,temb)<0){       //比较a+b与b+a的大小(字符串比较),把小的顶到右边去
                char tem[6];                   //临时数组保存a[i]
                strcpy(tem,a[j]);
                strcpy(a[j],a[j+1]);
                strcpy(a[j+1],tem);
            }
        }
    }
    for (i=0;i<3;i++){          //按行输出二维数组
        printf ("%s",a[i]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/fanqieya/p/10807394.html

时间: 2024-10-07 17:43:15

算法题:整数排成一排求最大值的相关文章

算法学习——贪心算法之删数字(求最大值)

算法描述 在给定的n位数字,删除其中的k位数字( k < n),使得最后的n-k为数字为最大值(原次序不变) 算法思路 考虑到是要移出数字,我们使用链表设计此算法较为方便,链表可以直接移出某个位置的元素 使用贪心算法,每一步都要达到最优 从最高位开始,若是下一位比上一位大,则比上一位的数字移出,结束之后再次从最高位开始 例如 16489657 删除4个数字 首先比较1和6 删除1 得到 6489657 之后,再次比较 6和4 往后推 可得到 689657 以此类推 删除4个数字之后 可得到 96

算法题:不使用+-&#215;/求一个数的7倍

#include <iostream> #include <stdlib.h> #include <stdio.h> using namespace std; int Grial(int n) { int a=n<<3; int b=a&(-n); int temp; a=a^(-n); while(b!=0) { b=b<<1; temp=a; a=a^b; b=temp&b; } return a; } int main()

算法题:求数组中最小的k个数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:输入n个整数,找出其中最小的k个数. <剑指offer>给出了两种实现算法: 算法1:采用Partition+递归法,该算法可以说是快速排序和二分查找的有机结合.算法的时间复杂度为O(n),缺点在于在修改Partition的过程中会修改原数组的值. 算法2:采用top-k算法.如果要找最小的K个数,我们才用一个含有K个值的大顶堆:如果要找最大的K个数,我们采用小顶堆.该算法的时间复杂度为O(nlogK),是一种比较好的算法,启发于堆排序

1138: 零起点学算法45——求最大值

1138: 零起点学算法45--求最大值 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1691  Accepted: 879[Submit][Status][Web Board] Description 输入一些整数,求最大值 Input 多组测试数据 首先输入1个整数n表示测试组数 然后每行首先输入1个整数m,再输入m个整数 Output 对于每组测试数据输出1行,内容为m个整数的最大值 Sa

笔试算法题(23):数值整数次方 &amp; 最大对称子串

出题:数值的整数次方(不考虑溢出),实现函数double Power(double base, int exponent): 分析: 解法1:最简单的方法是使用直接的乘法运算,但是注意处理几种特殊情况:exponent为负数,base为0: 解法2:将exponent分解成2的不同次方相加的表达式,通过重复平方来最大程度的减少乘法运算的次数. 当然,也可以递归实现,当n为偶数时,a^n=a^(n/2) * a^(n/2):当n为奇数时,a^n=a^((n-1)/2) * a^((n-1)/2)

笔试算法题(22):二分法求旋转数组最小值 &amp; 骰子值概率

出题:将一个数组最开始的k个(K小于数组大小N)元素照搬到数组末尾,我们称之为数组的旋转:现在有一个已经排序的数组的一个旋转,要求输出旋转数组中的最小元素,且时间复杂度小于O(N): 分析: 时间复杂度小于O(N)也就是不能用常规的遍历思路:可以将数组看成两个都是递增序列(假设为升序)的子数组,并且前半段的元素均大于等于后半段的元素,分界点的位于后半段数组的第一个元素就是最小元素: 具体算法:两个指针left和right指向数组第一个和最后一个元素,使用Binary Search确定中间元素mi

算法题:给你一个自然数N,求[6, N]之内的全部素数中, 两两之和为偶数的那些偶数。

/* 算法题:给你一个自然数N,求[6, N]之内的全部素数中. 两两之和为偶数的那些偶数. */ #include <iostream> using namespace std; void Grial(int n) { int *b = new int[n]; int k = 0; b[k++] = 2; b[k++] = 3; b[k++] = 5; for (int i = 6; i < n; i++) { int j; for (j = 0; j < (k+1) / 2 ;

算法题:求链表倒数第K个结点

说明:本文仅供学习交流,转载请标明出处,欢迎转载!  题目:给出一个单链表,返回倒数第K个结点,最后一个结点为倒数第1个. <剑指offer>上面给的解法是设置两个指针,这里记为p1.p2,先让p2走(k-1)步,然后p1.p2同时走,当p2走到最后一个结点时,p1所指向的结点就是倒数第k个结点. 我觉得按照这样的逻辑写代码反而更容易出错,因为我们需要把我两件重要的问题:(1).p2先走(k-1)步:(2)循环结束的条件是p2到达最后一个结点,即p2->next==NULL.显然这样不太

一道算法题-从1到n整数中1出现的次数

1. 题目描述 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次. 2. 题目来源 第一次看到是在<剑指Offer>第2版上,面试题32.leetcode和牛客网上都有这道题. 3. 本文的目的 看了<剑指Offer>上的解法,我觉得不能算好: 这段解释描述有些不清晰,而且没有图,难以理解. 从书中给出的实现上来看,显得有些凌乱. 在这篇博客里,会给出一个我对这道题的解法,包括完整