华为机试 (11/8)

输出最小的k个数

输入n个整数,输出其中最小的k个。
本题有多组输入样例,请使用while(cin>>)等方式处理

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = null;
        while ((str = br.readLine()) != null) {
            if (str.equals("")) continue;
            String[] params = str.split(" ");
            int n = Integer.parseInt(params[0]), k = Integer.parseInt(params[1]);
            int[] res = new int[n];
            int start = 0, index = 0;
            if (params.length > 2) start = 2;
            else params = br.readLine().split(" ");
            for (int i = start; i < params.length; i++) {
                res[index++] = Integer.parseInt(params[i]);
            }
            Arrays.sort(res);
            StringBuilder ans = new StringBuilder();
            for (int i = 0; i < k; i++) ans.append(res[i]).append(" ");
            System.out.println(ans.toString().trim());
        }
    }
}
#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    int num, n;
    while(cin>>num>>n){
        int a[num];
        for(int i=0;i<num;i++){
            cin>>a[i];
        }
        sort(a,a+num);
        for(int i=0;i<n-1;i++){
            cout<<a[i]<<' ';
        }
        cout<<a[n-1]<<endl;
    }
    return 0;
}

成绩排序

查找和排序

题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。

例示:
jack 70
peter 96
Tom 70
smith 67

从高到低 成绩
peter 96
jack 70
Tom 70
smith 67

从低到高

smith 67

jack 70

Tom 70
peter 96

注:0代表从高到低,1代表从低到高

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/*
*			查找和排序
		题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
	都按先录入排列在前的规则处理。

			例示:
		jack      70
		peter     96
		Tom       70
		smith     67

			从高到低  成绩
		peter     96
		jack      70
		Tom       70
		smith     67

			从低到高
		smith     67
		jack      70
		Tom       70 
		peter     96

	注:0代表从高到低,1代表从低到高
*/
public class Main {
	  public static void main(String[] args) throws IOException{
		  BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
		  String str="";
		  while((str=br.readLine())!=null){
			  int n=Integer.parseInt(str.trim());
			 
			  int bool=Integer.parseInt(br.readLine().trim());
			  String[] name =new String[n];
			  int[] score=new int[n];
			  for(int i=0;i<n;i++){
				  str=br.readLine().trim();
				 String[] temp= str.split(" ");
				  name[i]=temp[0];
				  score[i]=Integer.parseInt(temp[1]);
			  }
			  if(bool==0){  // 由高到低
				  for(int i=0;i<n;i++){
					 
					  for(int j=0;j<n-1-i;j++){
						  if(score[j+1]>score[j]){
							 String na=name[j];
							  name[j]=name[j+1];
							  name[j+1]=na;
							  int t=score[j];
							  score[j]=score[j+1];
							  score[j+1]=t;
						  }
					   
				  }
					  
				  }
			  }else{  // 由低到高
				  for(int i=0;i<n;i++){
		  
					  for(int j=0;j<n-1-i;j++){
						  if(score[j+1]<score[j]){
							 String na=name[j];
							  name[j]=name[j+1];
							  name[j+1]=na;
							  int t=score[j];
							  score[j]=score[j+1];
							  score[j+1]=t;
						  }
				  }
					  
					   
				  }
			 
			  
			 }
			  StringBuilder sb = new StringBuilder();
				for(int i=0;i<n;i++) {
					sb.append(name[i] + " ");
					sb.append(score[i]);
// 					if(i!=(n-1)) {
// 						sb.append("\n");
// 					}
                    sb.append("\n");
				}
              sb.deleteCharAt(sb.length()-1);
				System.out.println(sb.toString());
		  }
	}
	
}

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
class user {
public:
	string name;
	int score;
};
bool cpmpare0(user a, user b) {
	return a.score  > b.score ;
}
bool cpmpare1(user a, user b) {
	return a.score < b.score;
}
int main() {

	int count,flag;
	while (cin>>count>>flag) {
		vector<user> biao;
		for (int i = 0; i < count; i++) {
			user temp;
			cin >> temp.name >> temp.score ;
			biao.push_back(temp);
		}
		if(flag)
			stable_sort(biao.begin(), biao.end(), cpmpare1);
		else
			stable_sort(biao.begin(), biao.end(), cpmpare0);
		for (int i = 0; i < count; i++) {
			cout << biao[i].name << " " << biao[i].score << endl;
		}
	}
}

火车进站

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号,火车站只有一个方向进出,同时停靠在火车站的列车中,只有后进站的出站了,先进站的才能出站。要求以字典序排序输出火车出站的序列号。
(1)这时候可以是1 到站后 马上就出站;然后2 进站,然后2出站;最后3进站,然后3出站;这时候出站顺序是 1 2 3;
(2)也可以是1 进站,2进站,这时候,必须2先出站,接着1出站。最后是3进站,然后3出站;这时候出站顺序是2 1 3;
(3)当然也可以是1 进站,2进站,3进站;然后必须是 3 先出站,2 次出站,1最后出站
解释一下为什么3 1 2不可以;
要是3先出站,必须是 1 进站 2进站 3进站;这时候3出站,但是这时候2在1的前面,必须是2先出站最后是1出站,因此3 1 2这个答案不行;

import java.util.*;
public class Main{
    static Stack<String> stack = new Stack<String>();
    static Stack<String> list = new Stack<String>();
    static List<String> result = new ArrayList<>();
     
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int n = in.nextInt();
            in.nextLine();
             
            String line = in.nextLine();
            process(line);
        }
    }
    public static void process(String s){
        String[] strs = s.split("\\s");
        for(int i=strs.length-1; i>=0; i--){
            list.push(strs[i]);
        }
        method("");
        Collections.sort(result);
        for(String r : result){
            System.out.println(r);
        }
    }
    public static void method(String s){
        if(stack.empty()&&list.empty()){
            result.add(s.trim());
            return ;
        }
        if(!stack.empty()){
            String str = stack.pop();
            method(s+" "+str);
            stack.push(str);
        }
        if(!list.empty()){
            String str = list.pop();
            stack.push(str);
            method(s);
            stack.pop();
            list.push(str);
        }
    }
}


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
#define MAX_N 10
char result[12000][12];
int result_cnt;
int stack1[MAX_N];
int index1;
int stack2[MAX_N];
int index2;
int stack3[MAX_N];
int index3;
int size;
 
void dfs(){
    if(index3==size){
        int i;
        for(i=0;i<size;i++)
            result[result_cnt][i]=stack3[i]+'0';
        result[result_cnt][i]='\0';
        result_cnt++;
        return;
    }
    if(index2!=-1){//站内有车
        stack3[index3]=stack2[index2];
        index3++;
        index2--;
        dfs();
        stack2[++index2]=stack3[--index3];
    }
    if(index1<size){
        stack2[++index2]=stack1[index1];
        index1++;
        dfs();
        index2--;
        index1--;
    }
}
int comp(const void *a,const void *b){
    return strcmp((char*)a,(char*)b);
}
 
int main(){
    while(scanf("%d",&size)!=EOF){
        int i,j;
        for(i=0;i<size;i++){
            scanf("%d",&stack1[i]);
        }
        index1=0;
        index2=-1;
        index3=0;
        result_cnt=0;
        dfs();
        qsort(result,result_cnt,sizeof(result[0]),comp);
        for(i=0;i<result_cnt;i++){
            for(j=0;j<size;j++){
                printf("%c ",result[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值