2014 amazon 在线 面试题目 爬山问题:打印出从A点到B点的距离

爬山问题(百度笔试2018) 问题描述冬木市西边的园藏山是著名的旅游圣地。从空中俯瞰,园藏山可以看成一个 n * m 的矩阵,我们把行从上往下按 1 到 n 编号,把列从左往右按 1 到 m 编号,那么(i, j)就表示矩阵第 i 行第 j 列的位置。我们用ℎi,j , 表示位置(i, j)的海拔高度。初始时,Saber 在(sx, sy)这个位置,她想前往更高的地方。每一次她可以选择向上、下、左、右其中一个方向走,但不能走出... 阅读详情

关于那个爬山距离问题的代码说明。

1)题目要求从A(0.0)到B(0,100)的距离,其中要爬过许多山。

  用<起点,终点,高度> 来表示一座山。如果是别的数值,请修改它。


2)一座山的坐标中startpoin和endpoint是否可以跟别的山可以重合成一样?

  这个问题在题目里没有明确说,而且从它给的测试用例看是不重合的,故在该程序中假设没有这种重复节点的情况。

 

3)测试用例输入格式,我记得原题的输入输出格式如下(我没有记得在哪里给出了B点的坐标)。

 

  //input format

    3             //表示有3座山

 1,3,1   //第一座山的坐标是起点1,终点3, 高度1。

    2,4,2  //第二座山的坐标是起点2,终点4, 高度2。

   7,8,3   //第三座山的坐标是起点7,终点8, 高度3。

//output

     110     //从A点到B点,需要110步

我的这个代码测试用例和执行过程为:

./amazon_climb_mountain

3

1,3,1  

2,4,2  

7,8,3  

110 

//从A(0.0) 点到B(100.0)点,需要110步。


/*
 somebody go from A (0,0) to B (0,D) via many mountains which use tri-tuple <startx,endx,height>.
 * this guy must be walk up  when arriving at mountains and climb down when leave this mountain.
 * Here 这里山的坐标会交叉或者重叠。
   questions: how many steps after he cross these mountains from starting point (0,0).  
 * 
 *|
 * input:
         3  //total  mountain's number
   mountain1:  <startx1,endx1,height1>
 mountain2:   <startx2,endx2,height2>
 mountain3:  <startx3,endx3,height3>

 * output:
 *     steps
 * 
 * Solution:
 *  1) 垂直方向的steps 就是 把各个合体山(几个起点或终点坐标有交差重叠的山)的最高高度乘以2倍,再把这些数值加起来。
 *      如果合体山的起始点与前面的合体山的终点是一样的,则要注意特殊处理
 *  2) 水平方向的steps 就是最远点的坐标点
 */
#include <cmath>
#include <cstdio>
#include <vector>
#include <map>
#include <stack>
#include <list>
#include <iostream>
#include <algorithm>
#include <cstring>
 
//must include it for strlen() in some compilers
using namespace std;

class Node {
private:
 long PointValue;
 long height;
 bool Isstartpoint; 
 public:
     Node(long value, long height, bool Isstartpoint){
         this->PointValue=value;
         this->height=height;
         this->Isstartpoint=Isstartpoint;
     }
     virtual ~Node(){
         ;
     }
     
     long getPointValue() {
         return PointValue;
     }
     long getheight() {
         return height;
     };
     bool IsStartPoint() {
         return this->Isstartpoint;
     }
     
     bool operator <( const Node& rt) const {  
        cout<<"call this operator <"<<endl;
       return ( PointValue < rt.PointValue);  
  }  
     bool operator >( const Node& rt) const{  
         cout<<"call this operator >"<<endl;
       return (PointValue > rt.PointValue);  
   }  
};

bool isSpace(char x){
    return x == ' ' || x == '\r' || x == '\n' || x == '\r' || x == '\b' || x == '\t';
}

char * rightTrim(char *str){
      long len = strlen(str);
    while(--len>=0){
        if(isSpace(str[len])){
            str[len] = '\0';
        }else{
            break;
        }
    }
    return str;
}

char * getInputLine(char *buffer,   long length){
    if(fgets(buffer,length, stdin)==NULL){
        return NULL;
    }
    rightTrim(buffer);
    if(strlen(buffer)<=0){
        return NULL;
    }
    return buffer;
}

//array saves data delimited by ',' parsed from one line.
//return the total number of data
long splitAndConvert(char* strings, long *array){
    char* tokenPtr = strtok(strings,",");
      long i=0;
    while(tokenPtr != NULL){
        array[i] = atol(tokenPtr);
        i++;
        tokenPtr=strtok(NULL,",");
    }
    return i;
}
  /*
      | ------ |
   ------------------    
   |                 |
 -----------------------
   */
  long process_data(vector<Node>& datavector){
      //sort data point increasingly
     sort(datavector.begin(),datavector.end(),less<Node>());
     //sort data point decreasingly
     //sort(datavector.begin(),datavector.end(),greater<Node>());
    
     long steps=0;
     long current_height=0;
     long lastMountheight=0;
     bool mountainconnected=false;
     
     int accumulate=0; //用于找到合体山,即起始点和终止点个数一样。
     
     // 垂直方向的steps 就是把各个合体山的高度的2倍加起来。
     
     for(int len=0; len <datavector.size();len++ ){
         if(datavector[len].IsStartPoint()) 
             accumulate++;
         else 
             accumulate--;
         
         //find the highest height of this complicated mountain
         if(datavector[len].getheight() > current_height)
             current_height=datavector[len].getheight();
                          
         //find the complete complicated mountain
         if(accumulate==0) {
             //if this mountain is connected to former mountain
             if(mountainconnected==true){
                 if(lastMountheight < current_height) {
                     steps += 2*(current_height - lastMountheight);
                 } 
                 //if lastMountheight  > current, nothing to do
             } 
             else {
                 steps += (2*current_height);
             }
             
            lastMountheight=current_height;
            current_height=0;   
             
            //check whether this mountain is connected the next mountain, that is,its endpoint is the same as the start point of next mountain.
            if(len <(datavector.size()-1)) {
                if(datavector[len].getPointValue()==datavector[len+1].getPointValue()){
                    mountainconnected=true;
                }
                else  {
                    mountainconnected=false; 
                }
            }
         }
     }
     //水平方向的steps 就是最远点的坐标点
     //datavector.front()to get this first element;
     steps += datavector.back().getPointValue(); //get this furthest point value
     return steps;
  }
  
int main(int argc, char** argv) {
    char *line=new char[1000];
    cout<<"input number of mountains:"<<endl;
    getInputLine(line,1000);
    long number[1];
    long NumberLength = splitAndConvert(line,number);
  
    if(NumberLength != 1) {
        cout<<"error"<<endl;
        return 0;
    }
    cout<<"input mountains <start,end,height>"<<endl;;	
    //save all input int data one by one
    vector<Node> datavector;
    int index=0;
    while(index<number[0]){
        //get trip tuple<startpoint,endpoint, height> for each mountain data from stdin one line by line
         getInputLine(line, 1000); 
         long data[3];
         long len=splitAndConvert(line,data);
       //valid check for array
       if(len !=3 ){
         cout<<" input parameter error, exit "<<endl;
         return 0;   
        }  
      index++;
      
      Node mnode1(data[0],data[2],true); //start point
      datavector.push_back(mnode1);
      Node mnode2(data[1],data[2],false); //end point
      datavector.push_back(mnode2);
    }
    cout<<process_data(datavector)<<endl;
    cout <<"completes successfully, exit"<<endl;         
    return 0;
}


爬山-编程题 爬山 时间限制:C/C++语言 1000MS;其他语言 3000MS 内存限制:C/C++语言 65536KB;其他语言 589824KB 题目描述: 小B曾经酷爱网络游戏,整日通宵达旦的玩游戏,导致身体素质急剧下降,因此下决心痛改前非,远离一切电子产品,并通过远足爬山的方式改变生活方式并提高身体素质。由于担心对身体造成太大的负荷,他总是选择最平坦的路径,并记录每天的行程情况及达到的最 阅读详情

相关推荐

程序员面试宝典-棋盘格从A到B点的路径总数

程序员面试宝典-棋盘格从A到B点的路径总数 棋盘格从A到B点的路径总数 题目 题目:Find the number of different shortest paths from point A to point B in a city withperfectly horizontal streets and vertical avenues as shown in the follo

那远远的云端 3832

将一个二叉树转化为双向链表,不开辟新空间

假设 转后后 节点 的 left 指针 作为 next 指针, right 指针 作为 prev 指针 思路:首先可以利用的指针 即是 叶子节点 的 指针。这样 我们 可以 不断 把 一部分节点 移到 找到的新叶子节点 后面,比如 把 右节点 移到 左叶子几点后面。 简单的想, 假设 我们 把 左右子树已经 转换 好了, 这个时候 我们 我们 只要 把 右子树转换后的链表 添加 到 左子树 ...

weixin_30892763的博客 312

几道亚马逊面试题参考答案

以前给别人写的几道亚马逊面试题参考答案。题目在源代码文件内。

一个8*8的方格子,A点在左下角,B点在右上角,求A点到B点的最短路径有多少条

题目:  一个8*8的方格子,A点在左下角,B点在右上角,求A点到B点的最短路径有多少条

cug_stu的专栏 1万+

手把手教你用ROS2 Humble给PX4无人机写个“画圆”程序:从C++代码到Gazebo仿真全流程

本文详细介绍了如何使用ROS2 Humble和PX4飞控实现无人机圆形轨迹控制,涵盖从环境配置、Gazebo仿真到C++代码实现的完整流程。通过实战教程,读者将掌握轨迹跟踪仿真的核心技术,包括ROS2与PX4的通信接口、圆形轨迹算法设计及Gazebo仿真调试技巧。

weixin_29056781的博客 257

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析

题目没有任何提示,附件gzl.pcap解题哥斯拉流量300多KB包很多,没啥经验只能挨个看回来之后又狠狠得撸了一把哥斯拉流量分析我这里用的是哥斯拉4.0.1测试链接这里发了两个包,我们进行分析。

深耕网络安全领域,聚焦护网行动(HW)、渗透测试、等级保护(等保)、CTF 竞赛四大核心方向,提供技术干货、实战经验与行业洞察。 1810

算法面试题之:一个3*4表格从A到B一共有多少总走法

问题:一个3*4表格只能向右和向下走,不可以折线和回退,从A点到B点一共有多少总走法 解题关键:1是规律2是递归 第一步找规律 先设置坐标x,y.查出比较简单范围的点条数 根据上图我们得到三个规律 1、如果x等于0那么路线只有一条。 2、如果y等于0那么路线只有一条。 3、(x,y)点数据可以用(x-1,y)点的路线+(x,y-1)点的路线得到。 4、(0,0)点的路线为0...

Alice_qixin的博客 1万+

SARscape的DInSAR全流程-以西安市隋大兴唐长安城遗址为例

通过DInSAR对西安市隋大兴唐长安城遗址开展的年度周期性监测,发现成因是地质内部构造断裂带活动所导致的地面产生物理空间上的形变,而地面的沉降与抬升是直接影响城市发展与文化遗产保护最为常见的缓变型不可逆地质灾害。西安市地处汾渭断陷盆地中部,受临潼-长安断裂带影响,导致区域内构造活动较为强烈。由于早年西安市地表水资源匮乏,从上世纪50年代末开始大量开采地下水资源以满足城市人口不断扩张的需求,从而导致地下承压含水层水位急速下降,形成多个局部沉降中心(八里村、西工大、电子城等)。

2301_77687129的博客 5815

亚马逊面试题目1

准备面试过程中看到网上流传的一道亚马逊的面试题。认为很有意思,自己写了一遍code,如今和大家分享一下,题目例如以下: 数组有N-2个数字,数字的范围为1 ... N,没有反复的元素,要求打印缺少的2个数字,不能够用额外的空间。 方法1. 经过分析题目能够看出,数组中缺了两个数字,直观上能够通过把数字排序,然后从头到尾进行扫描。找到缺失的两个数字。由于有排序,而排序的时间复杂度...

weixin_34289744的博客 1727

什么是PMOS?什么是NMOS?两者有什么区别?

这个电压差被称为阈值电压(Vth),通常为0.7V至2V(低压NMOS)或4V至10V(功率NMOS)。当Vgs(栅极-源极电压)大于Vth时,沟道中的电子被吸引到栅极下方,形成导电通路,使电流可以从漏极流向源极。NMOS与PMOS的结构类似,都由三大部分组成:栅极(Gate)、源极(Source)和漏极(Drain)。由于NMOS在开启时,电子是主要的载流子,电子的迁移率比空穴高,因此NMOS通常具有更低的导通电阻(Rds(on)),这使其成为高速开关电路中的首选。它的沟道由电子(负载子)传导。

硅农深芯的博客 6435

4、分布式发电系统中用于改善电能质量的有源、无源和混合滤波器

本文探讨了分布式发电系统中,尤其是光伏(PV)系统运行过程中引入的电能质量问题,并分析了有源滤波器、无源滤波器及混合滤波器在改善电能质量方面的应用。文章详细介绍了光伏系统的建模、最大功率点跟踪(MPPT)技术,以及谐波、电压波动等技术问题,同时对各类滤波器的拓扑结构和控制方法进行了系统性总结。通过仿真实例比较了不同滤波器在减少谐波方面的效果,为实际工程应用提供了参考依据。

transformer2023的博客 89

Python算法学习day4:关于一道亚马逊面试题的情景分析

题目描述 亚马逊是一家纳斯达克上市公司,通过其财报我们可以解读它在给定时期内的股票走势信息。 这些信息包括每天交易的最高价、最低价以及开盘价。假定你作为交易员,必须在股票开盘时做出买入或卖出的决定。 你负责设计一个算法,根据给定的股价走势信息,决定买入和卖出策略,该策略必须保证你的交易获得的利润最大化。 假设S数组有以下9个数值[10,4,8,7,9,6,2,5,3] 1. 暴力枚举法 # S定...

普通Gopher 628

[系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向

娜璋AI安全之家于2020年8月18日开通,将专注于Python和安全技术,主要分享Web渗透、系统安全、CVE复现、威胁情报分析、人工智能、大数据分析、恶意代码检测等文章。真心想把自己近十年的所学所做所感分享出来,与大家一起进步。 系统安全系列作者将深入研究恶意样本分析、逆向分析、攻防实战等,通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步。第一篇文章先带领大家学习什么是逆向分析,然后详细讲解逆向分析的典型应用,接着通过OllyDbg工具逆向分析经典的游戏扫雷,再通过Cheat Engin

杨秀璋的专栏 2万+

深度优先DFS和广度优先BFS的非递归实现

void DFS(Node root) //非递归实现 { stack s; root.visited = true; printf("%d ", root.val); //访问 s.push(root); //入栈 while (!s.empty()) { Node pre= s.top();

李鑫o_O 7305

五步通关!宝塔Linux部署ASP.NET Core的魔法秘籍大公开!

摘要: 本文提供ASP.NET Core应用五步部署攻略,涵盖从环境配置到线上运行的完整流程: 1️⃣ 环境准备:安装宝塔面板、ASP.NET Core运行时及开放端口; 2️⃣ 应用发布:通过dotnet publish生成独立部署包并上传服务器; 3️⃣ Nginx配置:设置反向代理将域名请求转发至应用端口; 4️⃣ 进程守护:使用Supervisor确保应用持续运行; 5️⃣ HTTPS加密:通过宝塔快速申请SSL证书并解决验证路径冲突。 关键点: 强调权限设置(755)、端口开放及反向代理细节; 提

java专栏 969

simulink的电动汽车制动系统热管理仿真

本文系统研究了电动汽车制动系统热管理仿真技术。通过建立机电液多物理场耦合模型,分析了不同工况下的动态热平衡特性。提出基于MPC的动态调节和NSGA-II多目标优化算法,使电池温度波动降低60%。创新性采用石墨烯相变材料与微通道液冷复合技术,冷却系统能耗减少40%。研究构建了完整的工程验证平台,涵盖200kW电制动测试台和高精度热成像系统。展望指出,未来将结合Transformer预测和强化学习算法,进一步优化热管理策略。该研究为电动汽车制动系统热管理提供了从理论建模到工程实施的完整解决方案。

xiaoheshang_123的博客 121

亚马逊面试经历

最近参加了亚马逊中国的面试,前后总共六轮,特记录下各面的考察点 1面-算法编程 题目1:将一颗平衡二叉树转换成双向链表,要求原地转换,不额外申请空间 题目2:找出一个字符串中不含重复字符的最长子串 2面-系统设计 系统设计: 1)挑选一个简历上的项目,讲讲你在设计时候的考虑,面试官针对你的讲述,进行讨论 2)现有一个3D打印机,能打印不同材质、颜色和类型的家具,请设计打印机的核心实现类,并画出对应...

ccmlove123的博客 7215

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

平衡二叉树转化为双向链表

很容易想到递归,实现确实不是太容易,对本人来说。 平衡二叉树是有序的,要求链表也是有序。 \ 代码: #include //平衡二叉树转化为双向链表 using namespace std; typedef struct tree{ int data; struct tree *lchild; struct tree *rchild; }Tree,*pTree; void

byf_study_alway的专栏 2014

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【LeetCode】最短路径条数问题(BFS)

【分析】 这是权值相同的最短路径问题,即单源点Dijkstra算法退化为BFS(广度优先搜索)。 假定起点为0,终点为N【思路】 step[i]:到达某点的最短路径的步数,如k点:step[9] = 3; pathNum[i]:最短路径的条数,如k点:pathNum[9] = 2; pathNum[0] = 1:自己不动就是一种路径的选择假设当前节点为F,①若邻结点K处,step[j] =

It’s All Uphill From Here 5675

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

将二叉搜索树转化为双向链表

题目:输入一棵二叉树,将该二叉树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 在二叉搜索树中,左子节点的值总是小于父节点的值,右子节点的值总是大于父节点的值,因此,我们在转换成排序双向链表时,原先指向左子节点的指针调整为指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点的指针。 由于要求转换之后的链表时排好序的,我们可以中序遍历树中的每

ChaseRaod的博客 1009

2014 一网络公司 在线 面试题目 爬山问题:打印出从A点到B点的距离

关于那个爬山距离问题的代码说明。 1)题目要求从A(0.0)到B点。在cpp中设置B点坐标是 B(0,100)。如果是别的数值,请修改它。   int PlaceBLocation=100;   2)一座山的坐标中startpoin和endpoint是否可以跟别的山可以重合成一样?   这个问题在题目里没有明确说,而且从它给的测试用例看是不重合的,故在该程序中没有处理节点重复的情况。

大树叶 技术专栏 744

亚马逊面试被拒

从伦敦面试回来后的第8天,收到了亚马逊HR打来的电话。接电话的时候,我都听得到自己心跳的声音,然后听到那句‘Unfortunately’顿时觉得万念俱灰。后面HR叽里呱啦的说了一堆话,就再也没听进去了。。。虽然这次面试准备了将近两个月,最后还是以失败告终,但是木已成舟,还是好好总结一下吧,希望对以后的面试乃至工作都有帮助。 我这次在伦敦onsite面试的是Amazon Video部门。面试一共分

huangyu20072010的专栏 1万+

Company A面试 笔试 : 爬山 算步骤 问题 另外一种解法

/*  somebody go from A (0,0) to B (0,D) via many mountains which use tri-tuple .  * this guy must be walk up  when arriving at mountains and climb down when leave this mountain.  * Here 这里山的坐标会交叉或者

大树叶 技术专栏 748
上一篇: 公司面试题目 打印矩阵,先往右打印,到头然后向左下打印,到头然后向左打印,最后向上打印
下一篇: amazon 出栈 进栈 序列 题目
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值