字节跳动笔试练习题

链接:https://www.nowcoder.com/questionTerminal/944e5ca0ea88471fbfa73061ebe95728?orderByHotValue=1&mutiTagIds=665&page=1&onlyReference=false
来源:牛客网

Z国的货币系统包含面值1元、4元、16元、64元共计4种硬币,以及面值1024元的纸币。现在小Y使用1024元的纸币购买了一件价值为N(0<N≤1024)N (0 < N le 1024)N(0<N1024)的商品,请问最少他会收到多少硬币?
w=int(input())
n=1024-w
count=0
if int(n/64)>0:
        count=count+int(n/64)
        n=n%64
if int(n/16)>0:
        count=count+int(n/16)
        n=n%16 
if int(n/4)>0:    
        count=count+int(n/4)
        n=n%4
count=count+n
print(count)     

 链接:https://www.nowcoder.com/questionTerminal/5afcf93c419a4aa793e9b325d01957e2?orderByHotValue=1&mutiTagIds=665&page=1&onlyReference=false
来源:牛客网

小明是一名算法工程师,同时也是一名铲屎官。某天,他突发奇想,想从猫咪的视频里挖掘一些猫咪的运动信息。为了提取运动信息,他需要从视频的每一帧提取“猫咪特征”。一个猫咪特征是一个两维的vector<x, y>。如果x_1=x_2 and y_1=y_2,那么这俩是同一个特征。
       因此,如果喵咪特征连续一致,可以认为喵咪在运动。也就是说,如果特征<a, b>在持续帧里出现,那么它将构成特征运动。比如,特征<a, b>在第2/3/4/7/8帧出现,那么该特征将形成两个特征运动2-3-4 和7-8。
现在,给定每一帧的特征,特征的数量可能不一样。小明期望能找到最长的特征运动。
n=input()
m=int(input())
dict1={}
max1={}
max2={}
for j in range(0,m):
    xy=[]
    temp=[]
    v1=[int(x) for x in  input().strip().split()]
    for i in range(0,v1[0]):
        x1=str(v1[2*i+1])
        y1=str(v1[2*i+2])
        x1y1=x1+"_"+y1
        if x1y1 in max1.keys():#如果已经保存该特征值
             max1[x1y1]=max1.get(x1y1)+1
        else: 
            max1[x1y1]=1
            if x1y1 not in max2:
                max2[x1y1]=1
        xy.append(x1y1)
    if j!=0:
        for k in max1.keys():
            if k not in xy:
                if max1.get(k)>max2.get(k):
                    max2[k]=max1.get(k)
                temp.append(k)
        for k in temp:
            max1.pop(k)
for k in max1.keys():
    if max1.get(k)>max2.get(k):
        max2[k]=max1.get(k)
max3=[]
for c in max2.keys():
   max3.append(max2.get(c))
   #print(c,",",max2.get(c))
print(max(max3))

为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)

如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。 

n=int(input())
point={}
max1={}
for i in range(0,n):
    v1=[int(x) for x in input().split()]
    point[v1[0]]=v1[1]
for k in point.keys():
    iss=True
    for h in point.keys():
        if h>k and point.get(h)>point.get(k):
            iss=False
    if iss==True:
        max1[k]=point.get(k)
keyy=[]
for d in max1.keys():
    keyy.append(d)
keyy=sorted(keyy)
for dd in keyy:
    print(dd,max1.get(dd))
    
        
   

给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个:

区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列  [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值:

 

[6] = 6 * 6 = 36;

[2] = 2 * 2 = 4;

[1] = 1 * 1 = 1;

[6,2] = 2 * 8 = 16;

[2,1] = 1 * 3 = 3;

[6, 2, 1] = 1 * 9 = 9;

 

从上述计算可见选定区间 [6] ,计算值为 36, 则程序输出为 36。

区间内的所有数字都在[0, 100]的范围内; 

n=int(input())
v1=[int(x) for x in input().split()]
result=[]
for i in range(0,n):
    min1=0
    sum1=0
    for  j in range(i,n):
        min1=min(v1[i:j+1])
        sum1=sum(v1[i:j+1])
        result.append(min1*sum1)
print(max(result))

 

package test;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class test {

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int[] v2=new int[n];
        for(int i=0;i<n;i++) {
            v2[i]=Integer.valueOf(scanner.next());
        }
        List<Integer> result=new ArrayList<Integer>();
        for(int i=0;i<n;i++) {
            for(int j=i;j<n;j++) {
                result.add(getmin(v2,i,j)*getsum(v2,i,j));
            }
        }
        System.out.print(getmax(result));
        

    }
    
    public static int getmin(int[] n,int start,int end) {
        int min1=n[start];
        for(int i=start;i<end+1;i++) {
            if(n[i]<min1) {
                min1=n[i];
            }
        }
        return min1;
        
    }
    public static int getmax(List<Integer> n) {
        int min1=n.get(0);
        for(int i:n) {
            if(i>min1) {
                min1=i;
            }
        }
        return min1;
        
    }
    public static int getsum(int[] n,int start,int end) {
        int sum=0;
        for(int i=start;i<end+1;i++) {
            sum=sum+n[i];
        }
        return sum;
        
    }

}



原文地址:https://www.cnblogs.com/wl2017/p/11398999.html