首页 > 试题广场 >

数字游戏

[编程题]数字游戏
  • 热度指数:6775 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
牛牛举办了一场数字游戏,有n个玩家参加这个游戏,游戏开始每个玩家选定一个数,然后将这个数写在纸上(十进制数,无前缀零),然后接下来对于每一个数字将其数位按照非递减顺序排列,得到新的数,新数的前缀零将被忽略。得到最大数字的玩家赢得这个游戏。

输入描述:
输入包括两行,第一行包括一个整数n(1 ≤ n ≤ 50),即玩家的人数
第二行n个整数x[i](0 ≤ x[i] ≤ 100000),即每个玩家写下的整数。


输出描述:
输出一个整数,表示赢得游戏的那个玩家获得的最大数字是多少。
示例1

输入

3
9638 8210 331

输出

3689
#include<stdlib.h>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
    int n,i,Max=-1;
    for(cin>>n,i=0;i<n;i++){
        string x;
        cin>>x,sort(x.begin(),x.end());
        Max=max(Max,atoi(x.c_str()));
    }
    printf("%d",Max);
}

发表于 2017-11-28 23:21:06 回复(1)
Js一行代码
while(line=readline()){
    let line2=readline()
    function ans(line2) {
     return Math.max(...line2.split(' ').map((ele)=>{return parseInt(ele.split('').sort((a,b)=>{return a-b}).join('').replace(/\b(0+)/gi,""))})) 
    }
    print(ans(line2))
}

发表于 2017-12-04 17:52:01 回复(0)
import java.util.*;
public class Main {
    private static final int INT_MIN = -0x3f3f3f3f;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int max = INT_MIN;
        for (int i=0; i!=n; i++) {
            char[] inc = sc.next().toCharArray();
            Arrays.sort(inc);
            max = Math.max(max, Integer.parseInt(new String(inc)));
        }
        System.out.println(max);
    }
}
发表于 2019-01-21 00:00:05 回复(0)
思路:先把数字以字符串的形式读进来,再依次的把字符串进行分解生成一个新的一维数组,再给数组排序,根据排序好的数组生成一个新的字符串(注意的是如果数组的第一个元素是0则生成新的字符串时把零去掉),用上述的方法每一个旧的字符串都会生成一个对应新的字符串,最后找出最大的一个就行了
import java.util.*;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin=new Scanner (System.in);
		int n=cin.nextInt();//玩家人数(数字数量)
		String  str[]=new String [n];
		for(int i=0;i<n;i++) {
			String s=cin.next();
			String s1="";
			int b[]=new int [s.length()];
		   for(int j=0;j<s.length();j++) {
			   b[j]=Integer.parseInt(String.valueOf(s.charAt(j)));
		   }
		   Arrays.sort(b);
		   int dd=0;
		   if(b[dd] !=0)str[i]=String.valueOf(b[dd]);
		   else {
			   dd++;
			   str[i]=String.valueOf(b[dd]);
		   }
		   for(int j=dd+1;j<b.length;j++) {
			   if(j==0 && b[j]==0)continue;
			   else  str[i]=str[i]+String.valueOf(b[j])+s1;
		   }
			
		}
		int max=Integer.parseInt(str[0]);
		for(int i=1;i<n;i++) {
			max=Math.max(max, Integer.parseInt(str[i]));
		}
		System.out.print(max);

	}

}

发表于 2019-11-05 19:05:10 回复(0)
链接:https://www.nowcoder.com/questionTerminal/4f356b0618d14737a6f3782771bb4079
来源:牛客网
解题思路:
1.把需要处理的n个数字读入使用new创建的动态数组NUM;
2.对于数组NUM中每个元素执行相同的操作:计算数字长度,并利用数组temp存储数字的每一位数字,对数组temp进行升序排序,计算排序后的数组对应的十进制数;
3.找出经过步骤2处理的n个数中的最大值。

C++代码实现:
#include<iostream>
using namespace std;
const int LEN = 6;
long int fun(int a);
long int weight(int x);
int main()
{
    int n;
    while (cin >> n)
    {
       if(n>=1 && n<=50)
       {
        long int *num = new long int[n];
        long int *tempnum = new long int[n];
        int i;
        for (i = 0; i<n; i++){
            cin >> num[i];
        }
        for (i = 0; i<n; i++){
            tempnum[i] = fun(num[i]);
        }
        int MAX = tempnum[0];
        for (i = 1; i<n; i++)
        {
            if (MAX<tempnum[i]){
                MAX = tempnum[i];
            }
        }
        cout << MAX << endl;
      }
    }
    return 0;
}
long int fun(int a)
{
    int len = 0;
    long int temp = a;
    long int tempa[LEN];
    while (temp)
    {
        tempa[len] = temp % 10;
        temp = temp / 10;
        len++;
    }
    int i, j, k;
    for (i = 0; i<len; i++)
    {
        for (j = i + 1; j<len; j++)
        {
            if (tempa[i]>tempa[j])
            {
                k = tempa[i];
                tempa[i] = tempa[j];
                tempa[j] = k;
            }
        }
    }
    long int NUM = 0;
    for (int i = 0; i<len; i++){
        NUM += tempa[i] * weight(len-i-1);
    }
    return NUM;
}
long int weight(int x)
{
    long int W = 1;
    for (int i = 0; i<x; i++){
        W *= 10;
    }
    return W;
}
发表于 2019-09-08 11:58:29 回复(0)
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//对于每一个数字将其数位按照非递减顺序排列 int ChangNum(int x){
    vector<int> v1;
    int m, n;
    while (1){
        m = x % 10;
        v1.push_back(m);
        x /= 10;
        if (x == 0)
            break;
    }
    sort(v1.begin(), v1.end());
    int rec = 0;
    for (int i = 0; i < v1.size(); i++){
        rec *= 10;
        rec += v1[i];
    }
    return rec;
}
int main(){
    int n;
    cin >> n;
    vector<int> a;
    int x;
    for (int i = 0; i < n; i++){
        cin >> x;
        a.push_back(x);
    }
    for (int i = 0; i < n; i++){
        a[i]=ChangNum(a[i]);
    }
    sort(a.begin(), a.end());
    int count = *(a.end() - 1);
    cout << count << endl;
    system("pause");
    return 0;
}

发表于 2019-04-22 20:33:00 回复(0)
思想:利用 % /
1.先将数字拆分保存
2.重新排列数字
3.利用乘法得到新的数
4.比较大小
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int mid;
    vector<int> m;
    for(int i=0;i<n;i++)
    {
        cin>>mid;
        m.push_back(mid);
    }
    int res;
    int str=0;
    for(int i=0;i<n;i++)
    {
        int fin=0;
       
        vector<int> s;
        while(m[i]>=1)
        {
            res=m[i]%10;
            s.push_back(res);
            m[i]=m[i]/10;
        }
        sort(s.begin(),s.end());
        for(int i=0;i<s.size();i++)
        {
            fin =fin*10+s[i]*10;
        }
        fin=fin/10;
        if(fin > str)
        {
            str=fin;
        }
        
        s.clear();
    }
    cout<<str<<endl;
    return 0;
}

发表于 2019-04-20 14:39:47 回复(0)
  1. 利用 int//10 int%10
def result(num):
    if not num//10:
        return num
    L = list()
    while num//10:
        L.append(num%10)
        num //= 10
        if not num // 10:
            L.append(num)
    L.sort()
    obj = 0
    for item in L:
        obj = obj*10+item
    return obj
input()
print(max(map(result,list(map(int,input().split())) )))



编辑于 2019-04-12 19:51:29 回复(0)
n,arr=int(input()),list(input().split())
l=[]
for x in arr:
    l.append(''.join(sorted(x)))
print(max(list(map(int,l))))

编辑于 2019-03-29 17:32:41 回复(0)
def game(x):
    res = []
    for i in x:
        res.append(int("".join(sorted(i))))
    return max(res)

# max(map(lambda c :int(""join(sorted(c))), input().split()))

if __name__ == "__main__":
    n = int(input())
    x = input().split()
    print(game(x))

发表于 2019-03-20 11:14:06 回复(0)

n, x = input(), input().split()
print(max(map(int, [''.join(sorted(list(i))) for i in x])))

发表于 2019-03-18 19:00:40 回复(0)
这题也不难,思路是先求出每位的值,然后对位排序,因为不超过int的范围,所以可以直接通过循环加排序后的每一位得到目标值,然后最后再排序一次,取排序得到的最大值即可
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n;
    cin>>n;
    int* x=new int[n];
    int* rev=new int[n];
    for(int i=0;i<n;i++){
        cin>>x[i];
        int a[6],count=0,temp1=x[i],temp2=0;
        while(temp1>0){
            a[count++]=temp1%10;
            temp1/=10;
        }
        sort(a,a+count);
        for(int j=0;j<count;j++)
            temp2=temp2+a[j];
        rev[i]=temp2;
    }
    sort(rev,rev+n);
    cout<<rev[n-1]<<endl;
}

发表于 2019-03-05 17:46:13 回复(0)
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string>
#include<vector>
#include<math.h>
using namespace std;
int transfer(int a){
    string s = to_string(a);
    sort(s.begin(), s.end());
    return atoi(s.c_str());
}
int main(){
    int n;
    cin >> n;
    int x[55];
    //十进制数,无前缀0
    int max = -1;
    for(int i = 0; i < n; i++){
        cin >> x[i];
        if(transfer(x[i]) > max){
            max = transfer(x[i]);
        }
    }
    //数位按照非递减顺序排列 3689 0128 133
    cout << max << endl;
}

发表于 2019-03-02 16:45:08 回复(0)

这道题的用例极其不严谨!我一开始是这样实现的:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
    size_t n;
    while(cin>>){
        int res = -1;
        string x;
        for (size_t i = 0; i < n; i++) {
            cin >> x;
            sort(x.begin(), x.end());
            res = max(res, atoi(x.c_str()));
        }
        cout<<res;
    }
}

然后通过80%的样例,有一个样例居然是:

5
1 10 100 1000 10000 100000

n=5居然输入了6个数,导致我上面的代码的while循环体执行了两次,导致样例不通过,试问我如果是在笔试模式如何发现得了这种错误??
改代码如下通过:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
    size_t n;
    cin>>n;
    int res = -1;
    string x;
    for (size_t i = 0; i < n; i++) {
        cin >> x;
        sort(x.begin(), x.end());
        res = max(res, atoi(x.c_str()));
    }
    cout<<res;
}

强烈谴责出题人的不严谨的态度!

发表于 2019-02-17 12:21:47 回复(4)
#include <bits/stdc++.h>

using namespace std;

int F(int n){     int s=0,k=0;     vector<int> v;     while(n){         v.push_back(n%10);         n /= 10;         k++;     }     sort(v.begin(),v.end());     for(int i=0;i<v.size();i++)         s = s*10+v[i];     return s;
}

int main()
{     int n,x;     cin>>n     int a[n],Max=0;     for(int i=0;i<n;i++){         cin>>x;         Max = max(F(x),Max);     }     cout<<Max<<endl;     return 0;
}

发表于 2019-02-15 02:25:03 回复(0)
n = eval(input())
X = input().strip().split()
Y = []
for x in X:
    y = []
    for a in x:
        y.append(a)
    Y.append("".join(sorted(y)))
Z = list(map(int, Y))
print(max(Z))

发表于 2019-01-25 23:21:20 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

/**
 * @author wylu
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        br.readLine();
        
        int res = Integer.MIN_VALUE;
        for (String s : br.readLine().split(" ")) {
            char[] num = s.toCharArray();
            Arrays.sort(num);
            res = Math.max(res, Integer.parseInt(new String(num)));
        }
        System.out.println(res);
    }
}

发表于 2019-01-16 19:09:36 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        try(Scanner in = new Scanner(System.in)){
            int n = in.nextInt(),i = 0;
            String[] str = new String[n];
            while(i < n){
                str[i] = in.next();
                i++;
            }
            System.out.println(helper(str));
        }
    }
    public static int helper(String[] str){
        int max = 0;
        for(String s:str){
            char[] a = s.toCharArray();
            Arrays.sort(a);
            max = Math.max(Integer.parseInt(new String(a)),max);
        }
        return max;
    }
}


发表于 2019-01-16 17:16:34 回复(0)

python两行

a, b = input(), max(map(lambda c: int("".join(sorted(c))), input().split()))
print(b)
发表于 2019-02-24 19:22:51 回复(1)
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;cin>>n;
    vector<int> v;
    getchar();
    string t;
    for(int i=0;i<n;i++)
    {
        cin>>t;
        sort(t.begin(),t.end());
        for(int j=0;t[j]=='0';)
            t.erase(0,1);
        v.push_back(stoi(t));
    }
    sort(v.begin(),v.end());
    cout<<v[n-1]<<endl;
}
发表于 2022-01-14 18:40:48 回复(0)