水题(葡萄城题目)

(太闲了一天天的,只会c/c++和python所以选了2,5题)
题目出处:http://www.grapecity.com.cn/career/challenge

题目2:数据可视化

编程语言:不限
题目描述:

有句话是这么说的:“文不如表,表不如图”。形象地描述了图表在传达信息时,给接收者带来的截然不同的效率和体验。因此,在计算机计算能力、数据规模和决策需求都不断提升的当下,数据可视化的应用也越来越普遍。

数据可视化的范围很广,涉及到数据的获取、加工、建模、图形学,人机交互等很多概念和领域,想更快上手,获得更好的体验,使用DragonFly
BI这样的专业工具和服务是更明智的选择。

今天,我们通过一个简化的命题,来亲手实现简单的数据可视化。编写一个程序,对于给定的一组数据和要求,输出一个以字符组成的柱状图。

输入

第一行,一个整数 N(1<=n<=20),表示这组数据的条目数。
第二行,两个字符串,用于表示数据展示在柱状图上的排序方式。第一个字符串是“Name” 或者
“Value”,表示排序的依据是数据条目的名称亦或数值;第二个字符串是 “ASC” 或者 “DESC”,表示升序或降序。 随后的 N
行,每行包含一个字符串 S 和一个数字 V,以空格分隔,表示一条数据。S 即数据条目的名称,仅包含小写字母,V
即对应的数值,是一个整数,(0<=V<=1,000,000)

输入示例

3
Value DESC
apple 5
pen 3
pineapple 10

输出示例

在这里插入图片描述

题解

  1. 接受输入
  2. 关联排序
  3. 格式输出(找出最长的字符 和对应最大的value就好了,逐行print就好了)
  4. Don’t BB ,Please Code

python代码

#python 3.65,win10 Big——one 

#接受输入并初始化
def inputData():
    try:
        dataLen = int(input())
        gist, way = input().split(' ')
        data = []
        maxLenWrod = 0
        maxValue = 0
        for _ in range(dataLen):
            name, value = input().split(' ')
            temp1 = len(name)
            temp2 = int(value)

            data.append((name, temp2))
            if maxLenWrod < temp1:
                maxLenWrod = temp1
            if maxValue < temp2:
                maxValue = temp2
        return data, gist, way, dataLen, maxValue, maxLenWrod
    except:
        print("Error!输入错误")
#按要求排序
def mySort(data,gist,way):
    resv=False
    if way == "ASC":
        resv = False #升序
    elif way == "DESC":
        resv = True    #降序
    else:
        print("Warning!排序方式输入错误,请输入ASC:升序,DESC:降序(默认采用升序)")
    #采用lambda表达式选择排序对象,调用内置列表的排序方法
    if gist == "Value":
        data.sort(key=lambda x: x[1], reverse=resv)
    elif gist == "Name":
        data.sort(key=lambda x: x[0], reverse=resv)
    else:
        print("Warning!排序对象输入错误,请输入Name:按名称排序,Value:按值排序(默认采用按值排序)")
        data.sort(key=lambda x: x[1], reverse=resv)
#画表
def createTable(data,dataLen,maxValue,maxLenWrod):
    #由于黑方块在python输出中占两个字符位置因此,需要进行*2
    upside = "\u250c" + "\u2500" * (maxLenWrod+1) + \
             "\u252c" + "\u2500" * (2*maxValue + 1) + "\u2510" #表格上边
    downSide = "\u2514" + "\u2500" * (maxLenWrod+1) + "\u2534" \
               + "\u2500" * (2*maxValue + 1) + "\u2518"  #表格下边
    septalSide = "\u251c" + "\u2500" * (maxLenWrod+1) + "\u253c" \
                 + "\u2500" * (2*maxValue + 1) + "\u2524"  #表格间隔
    print(upside)
    for i in range(dataLen-1):
        name = data[i][0]
        value = data[i][1]
        #每一行数据(为了保持美观在字符前加一个空格  保持对称)
        temp = "\u2502" + "\u0020" +"\u0020" * (maxLenWrod - len(name))+name + "\u2502" + "\u0020" + \
           "\u2588" * value + "\u0020" * (2*maxValue - value * 2) + "\u2502"
        print(temp)
        print(septalSide)
    #最后一组数据显示
    name = data[-1][0]
    value = data[-1][1]
    temp = "\u2502" +"\u0020" +"\u0020" * (maxLenWrod - len(name))+name + "\u2502" + "\u0020" + \
           "\u2588" * value + "\u0020" * (2*maxValue - value * 2) + "\u2502"
    print(temp)
    print(downSide)
    pass
#主函数调用
def main():
    data, gist, way, dataLen, maxValue, maxLenWrod = inputData()
    mySort(data, gist, way)
    #print(data)
    createTable(data, dataLen, maxValue, maxLenWrod)

if __name__ == "__main__":
    main()
    input()#保持cmd窗口不关闭

结果示例
水题(葡萄城题目)_第1张图片
C++版
装逼演全套 c++也得整上

/*
author :Big——one  
c++11, Ubuntu16 
*/
//#include
#include
#include


using namespace std;
/*定义排序规则*/
//根据value的值升序排序
bool cmp1(pair<string,int>a,pair<string,int>b)
{
    return a.second < b.second;
}

//根据value的值降序排序
bool cmp2(pair<string,int>a,pair<string,int>b)
{
    return a.second > b.second;
}
//根据name的值升序序排序(a到z)
bool cmp3(pair<string,int>a,pair<string,int>b)
{
    return a.first < b.first;
}
//根据name的值降序排序(按z到a)
bool cmp4(pair<string,int>a,pair<string,int>b)
{
    return a.first > b.first;
}

/*定义制表*/
//上边 
void upSide(int x,int y)
{
	cout<<"\u250c";
	for(int i=0;i<x;i++)
		cout<<"\u2500";
	cout<<"\u252c";
	for(int i=0;i<y;i++)
		cout<<"\u2500";
	cout<<"\u2510"<<endl;
 } 
 //下边 
void downSide(int x,int y)
{
	cout<<"\u2514";
	for(int i=0;i<x;i++)
		cout<<"\u2500";
	cout<<"\u2534";
	for(int i=0;i<y;i++)
		cout<<"\u2500";
	cout<<"\u2518"<<endl;
 } 
 //分割
 void septalSide(int x ,int y)
 {
 	cout<<"\u251c";
 	for(int i=0;i<x;i++)
		cout<<"\u2500";
	cout<<"\u253c";
	for(int i=0;i<y;i++)
		cout<<"\u2500";
 	cout<<"\u2524"<<endl;
 }
//数据填入 
void dataLine(const pair<string,int>&data,int maxLenS,int maxV)
{
	int temp=0;

	cout<<"\u2502";
	//S字符 
	temp = maxLenS-data.first.length();
	for(int j=0;j<temp;j++)
	{
		cout<<" ";
	}
	cout<<data.first;
	cout<<"\u2502";
	//value方块 
	temp = maxV-data.second;
	for(int j=0;j<data.second;j++)
	{
		cout<<"\u2588";
	}
	for(int j=0;j<temp;j++)
	{
		cout<<" ";
	}
	cout<<"\u2502"<<endl;
} 
//制表
void createTable(const pair<string,int>*data,int maxLenS,int maxV,int N)
{
	maxV +=1;
	upSide(maxLenS,maxV);
	int temp=0;
	for(int i=0;i<N-1;i++)
	{
		dataLine(data[i], maxLenS, maxV);

		//分割
		septalSide(maxLenS ,maxV); 
	}
	dataLine(data[N-1], maxLenS, maxV);
	downSide(maxLenS, maxV);
}
 

int main() 
{

	int N=0;
	cin>>N;
	if(N>20||N<1) 
	{
		cout<<"input number 1<=N<=20"<<endl;
		exit(1);
	}
	string gist,way;
	cin>>gist>>way;
	if((gist!="Value"&&gist!="Name")||(way!="ASC"&&way!="DESC"))
	{
		cout<<"input the first char should be \"Value\" or \"Name\" "<<endl
		<<"and the second char should be \"ASC\" or \"DESC\""<<endl;
		exit(1);
	}
	
	pair<string,int>pr[20];
	int maxLenS = 0, maxV = 0;
	for(int i=0;i<N;i++)
	{
		cin>>pr[i].first>>pr[i].second;
		if(maxLenS<pr[i].first.length())
			maxLenS = pr[i].first.length();
		if(maxV<pr[i].second)
			maxV = pr[i].second;
	}	
	//按要求排序
	if(gist=="Value"&&way=="ASC") 
		sort(pr,pr+N,cmp1);
	else if(gist=="Value"&&way=="DESC")
		sort(pr,pr+N,cmp2);
	else if(gist=="Name"&&way=="ASC")
		sort(pr,pr+N,cmp3);
	else
		sort(pr,pr+N,cmp4);
	//制表
	createTable(pr,maxLenS,maxV,N);
	return 0;
}

水题(葡萄城题目)_第2张图片

题目5:杨辉三角

大水题,没啥说的,通项式:f(x,y)=f(x-1,y-1)+f(x-1,y)
Don’t BB ,Please Code

//dev-c++ 5.11
#include
int func(int x,int y)
{ 
    if((y==1)||(y==x))  return 1;//边缘为1 
    
 	return func(x-1,y-1)+func(x-1,y);//递归 f(x,y) = f(x-1,y-1)+f(x-1,y) 
} 
int main()
{
 	int x,y;
  	scanf("%d%d",&x,&y);
  	printf("%d\n",func(x,y));
  	
	return 0;
}

你可能感兴趣的:(python,c++,算法题)