网易笔试编程题

下厨房

题目描述

牛牛想尝试一些新的料理,每个料理需要一些不同的材料,问完成所有的料理需要准备多少种不同的材料。

输入描述:

每个输入包含 1 个测试用例。每个测试用例的第 i 行,表示完成第 i 件料理需要哪些材料,各个材料用空格隔开,输入只包含大写英文字母和空格,输入文件不超过 50 行,每一行不超过 50 个字符。

输出描述:

输出一行一个数字表示完成所有料理需要多少种不同的材料。
示例1

输入

BUTTER FLOUR
HONEY FLOUR EGG

输出

4
思路:利用集合set元素不重复的性质

#include
#include
#include
using namespace std;

int main(){
    string food;
    set set;
    while(cin >> food){
        set.insert(food);
    }
    cout << set.size() << endl;
    return 0;
}
数字翻转

题目描述

对于一个整数X,定义操作rev(X)为将X按数位翻转过来,并且去除掉前导0。例如:
如果 X = 123,则rev(X) = 321;
如果 X = 100,则rev(X) = 1.
现在给出整数x和y,要求rev(rev(x) + rev(y))为多少?

输入描述:

输入为一行,x、y(1 ≤ x、y ≤ 1000),以空格隔开。

输出描述:

输出rev(rev(x) + rev(y))的值
示例1

输入

123 100

输出

223
思路:巧妙的数字翻转方式

#include
using namespace std;

int rev(int m){
    int temp = 0;
    while(m != 0){
       temp = temp * 10 + m % 10;
       m /= 10;
    }
    return temp;
}

int main(){
    int x, y;
    while(cin >> x >> y)
        cout << rev(rev(x) + rev(y));
    return 0;
}
统计回文

题目描述

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
例如:
A = “aba”,B = “b”。这里有4种把B插入A的办法:
* 在A的第一个字母之前: "baba" 不是回文 
* 在第一个字母‘a’之后: "abba" 是回文 
* 在字母‘b’之后: "abba" 是回文 
* 在第二个字母'a'之后 "abab" 不是回文 
所以满足条件的答案为2

输入描述:

每组输入数据共两行。
第一行为字符串A
第二行为字符串B
字符串长度均小于100且只包含小写字母

输出描述:

输出一个数字,表示把字符串B插入字符串A之后构成一个回文串的方法数
示例1

输入

aba
b

输出

2
#include
#include
using namespace std;

int huiwen(string str){  //定义回文函数
      int len = str.length();
      for(int i = 0; i < len; i++){
          if(str[i] != str[len - 1])
              return false;
          len -= 1;  //len的值不断变化,往中间靠拢
      }
      return true;
}

int main(){
    string str1, str2, temp;
    while(cin >> str1 >> str2){
        int count = 0;
        temp = str1;
        int len = str1.length() + 1;
        for(int i = 0; i < len; i++){
            str1 = temp;  //重要的一步,将str1还原
            str1.insert(i, str2);  //插入str2,判断新的字符串是否是回文
            if(huiwen(str1))
                count++;
        }
        cout << count <
买苹果

题目描述

小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。如果不能购买恰好n个苹果,小易将不会购买。

输入描述:

输入一个整数n,表示小易想购买n(1 ≤ n ≤ 100)个苹果

输出描述:

输出一个整数表示最少需要购买的袋数,如果不能买恰好n个苹果则输出-1
示例1

输入

20

输出

3
//因为要袋子足够少,则原则上尽可能多买8个一袋的苹果。
#include
using namespace std;
 
int maxPackage(int n){
    int count = 0;  //袋子个数
    int mul, remains; 
    if(n % 2 != 0) //如果n不为偶数,直接返回-1
        return -1;
    if(n % 8 == 0){ 
        count = n / 8;
        return count;
    }
    else{
        mul = n / 8;  //8的倍数
        remains = n % 8;
        count += mul;
        n = n % 8;
        while(mul >= 0){
            if(n % 6 == 0){
                count += n / 6;
                return count;
            }
            else{   //回溯
                mul--;  //8包装袋-1
                count --;  //袋子个数-1
                n = n + 8;  //剩余苹果数量+8
            }
        }
        return -1;
    }
}

int main(){
    int n;
    cin >> n;
    cout << maxPackage(n);
    return 0;
}
藏宝图

题目描述

牛牛拿到了一个藏宝图,顺着藏宝图的指示,牛牛发现了一个藏宝盒,藏宝盒上有一个机关,机关每次会显示两个字符串 s 和 t,根据古老的传说,牛牛需要每次都回答 t 是否是 s 的子序列。注意,子序列不要求在原字符串中是连续的,例如串 abc,它的子序列就有 {空串, a, b, c, ab, ac, bc, abc} 8 种。

输入描述:

每个输入包含一个测试用例。每个测试用例包含两行长度不超过 10 的不包含空格的可见 ASCII 字符串。

输出描述:

输出一行 “Yes” 或者 “No” 表示结果。
示例1

输入

x.nowcoder.com
ooo

输出

Yes

思路:判断测试序列与原序列有多少位是相同的,如果相同的长度等于测试序列的长度,则该序列为原序列的子序列

#include
#include
using namespace std;

int main(){
    string str;
    while(cin >> str){
        string str1;
        cin >> str1;
        int a = 0, b = 0;
        while(a < str.length()){
            if(str[a++] == str1[b])
                b++;
        }
        if(b == str1.length())
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
}










你可能感兴趣的:(算法,C/C++,笔试)