Life of xhu

About

算法是硬伤 & HOJ_1518 & HOJ_1522

Apr 10, 2014

  |   #日常   |   #Algorithm   |   #HOJ

今天面试,这家企业感觉还是很不错的,面试的过程总体还可以,去教室的时候有两个面试官,我以为搞定一个就够了,没想到两个都要面,两轮直接一起搞定,我先囧rz。

面试的过程整体波澜不惊,第一个面试官问了我一些项目上的问题,然后问了对职业规划的看法,这些都好说。

然后面试官微微一笑,那我们来做一道算法题吧。

瞬间Orz啊有木有。。。

诚心的说,这次给的这道题还算简单的,就是找矩阵中的路径数以及经过的和最大的路线,我告诉面试官第一个应该分层用广度优先来做,第二个应该用动态规划,至于具体怎么规划,那就不知道了。

面试官说那就OK吧,然后聊了一些别的问题,比如Rails框架的看法什么的就完事了。

第二个比第一个感觉更OK一点,先问了我的代码量,我表示没这个概念,但是我在HOJ上刷了有70来道题了,编程能力应该是没问题的。

然后面试官说,那好,既然你对自己C++有信心,那么我们来写一合并有序链表的算法吧。

哈哈哈哈哈,居然是链表,不是树啊图啊什么的简直是上天庇佑啊有木有,稍微构思马上写好。

然后面试官说,要是两个列表里有重复元素,你现在这个代码该怎么改。

轻松随意,立马搞定。

面试官看了看,没有评价,直接开始问别的问题了,那个,你说说HTTP有多少个状态码吧。

这玩意儿计算机网络学的早忘了啊,我只好说就记得404是not found,403是forbidden,其他的就不知道了Orz。。。

面试官微微一笑,好吧,那今天的面试就到这里吧,你又什么要问的么。

-我那个链表的代码是对的么?

-大致上没什么问题。

OK,搞掂,看来基础的编程能力还是可以的。

不过算法始终是硬伤啊。。。。。

~~~~~~~~~~~~我是萌萌的昏割线~~~~~~~~~~~~~

1518: 题意就是判断一个算式如果数字都换为逆序数,算式还是不是成立。

需要注意的是,虽然0+0=0是结束条件,但是仍然要输出一个True

代码如下:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

void getNum(char des[], char src[], int i, int j){
    int k;
    for(k = 0; j >= i; k++, j--)
        des[k] = src[j];
    des[k] = '\0';
}
    
int main(){
    char input[50], num[50];
    int num1, num2, num3, loc1, loc2;
    while(scanf("%s", input) != EOF){
        for(int i = 0; i < strlen(input); i++){
            if(input[i] == '+')
                loc1 = i;
            else if(input[i] == '=')
                loc2 = i;
        }
        getNum(num, input, 0, loc1 - 1);
        num1 = atoi(num);
        getNum(num, input, loc1 + 1, loc2 - 1);
        num2 = atoi(num);
        getNum(num, input, loc2 + 1, strlen(input) - 1);
        num3 = atoi(num);
        if(num1 + num2 == num3){
            cout << "True" << endl;
            if(num1 == 0 && num2 == 0 && num3 == 0)
                break;
        }else
            cout << "False" << endl;
    }
}

1522:题意就是,A代表顺时针旋转,V代表逆时针旋转,输出得到的坐标。

代码如下:

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    char input[250];
    int x, y, state;  //state 1 up, 2 down, 3 left, 4 right
    while(scanf("%s", input) != EOF){
        x = 300;
        y = 420;
        cout << x << ' ' << y << ' ' << "moveto" << endl;
        state = 4;
        for(int i = 0; i <= strlen(input); i++){
            if(state == 1){
                y += 10;
                if(i != strlen(input))
                    state = input[i] == 'A' ? 4 : 3;
            }else if(state == 2){
                y -= 10;
                if(i != strlen(input))
                    state = input[i] == 'A' ? 3 : 4;
            }else if(state == 3){
                x -= 10;
                if(i != strlen(input))
                    state = input[i] == 'A' ? 1 : 2;
            }else if(state == 4){
                x += 10;
                if(i != strlen(input))
                    state = input[i] == 'A' ? 2 : 1;
            }
            cout << x << ' ' << y << ' ' << "lineto" << endl;
        }
        cout << "stroke\nshowpage" << endl;
    }
}