1. 程式人生 > >牛客華為機試題刷題筆記(一)

牛客華為機試題刷題筆記(一)

馬上華為提前批開始了,嚇得我趕緊上牛客網刷題,記錄如下:
所有程式碼都在github

1.字串最後一個單詞的長度

一段英文字串中最後一個單詞的長度。
題目比較簡單,做法有很多:
比如,
可以放到stringstream裡面split,拿到最後一個單詞
也可以從後往前數到第一個空格為止。

讓我覺得麻煩是第一次做這種要自己寫輸入的題,
C++用cin是遇到空格停止的,因此要用getline讀入一行

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string
str; getline(cin,str); int i=str.size()-1; int count=0; while(str[i]!=' '&&i>=0) { ++count; --i; } cout<<count<<endl; return 0; }

2.計算字元個數

輸入一個字串和一個字元,統計該字元在該字串中出現的次數。
for迴圈比較即可,沒什麼好說的

#include <iostream>
#include <string>
using namespace std; int main(int argc,char **argv) { string str; char c; getline(cin,str); cin>>c; int count=0; for(int i=0;i<str.size();++i) { if(tolower(str[i])==tolower(c)) ++count; } cout << count<<endl; return 0; }

3.明明的隨機數

說是隨機數,其實跟隨機數沒有半毛錢關係,
就是輸入一串整數,整數去重,輸出排好序的結果,
C++使用std::sortstd::uniquevector::erase可以輕易做到

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;


int main()
{
    // input 
    int n;
    while(cin>>n)
    {
    vector<int>v;
    v.reserve(1024);
    int j;
    for(int i=0;i<n;++i)
    {
        cin >> j;
        v.push_back(j);
    }
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    if(v.capacity()<1024)
        vector<int>(v).swap(v);

    //copy(v.begin(),v.end(),ostream_iterator<int>(cout,"\n"));
    for(int i=0;i<v.size();++i)
        cout<<v[i]<<endl;
    }
    return 0;
}

4.字串分隔

給定一個字串,對其等距(長度8)分隔,最後不足的補0
例如,123456789將分割成:1234567890000000

方法也很多,比如可以用string::substr,考慮到最後如果不足8個字元,需要補0,
這裡我先建立一個00000000然後用std::copy來做

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

int main(int argc, char ** argv)
{
    string str1;
    string str2;
    cin>>str1>>str2;


    for(int i=0;i<str1.size();i+=8)
    {
    string output("00000000");
    int l=(i+8)<str1.size()?8:(str1.size()-i);
    std::copy(str1.begin()+i,str1.begin()+i+l,output.begin());
    cout<<output<<endl;
    }
    for(int i=0;i<str2.size();i+=8)
    {
    string output("00000000");
    int l=(i+8)<str2.size()?8:(str2.size()-i);
    std::copy(str2.begin()+i,str2.begin()+i+l,output.begin());
    cout<<output<<endl;
    }

    return 0;
}

5.進位制轉換

16進位制轉成10進位制,基礎題沒啥好說的,
做一個map把0~F對映進去,比較方便,或者寫個if-else判斷當前字元是數字還是字母

#include <iostream>
#include <string>
#include <unordered_map>
#include <cmath>
using namespace std;
int main()
{
    unordered_map<char,int>mmap;
    mmap['0']=0;
    mmap['1']=1;
    mmap['2']=2;
    mmap['3']=3;
    mmap['4']=4;
    mmap['5']=5;
    mmap['6']=6;
    mmap['7']=7;
    mmap['8']=8;
    mmap['9']=9;
    mmap['a']=10;
    mmap['A']=10;
    mmap['b']=11;
    mmap['B']=11;
    mmap['c']=12;
    mmap['C']=12;
    mmap['d']=13;
    mmap['D']=13;
    mmap['e']=14;
    mmap['E']=14;
    mmap['F']=15;
    mmap['f']=15;
    string str;
    while(cin >> str)
    {
    str=str.substr(2);
    long sum=0;
    for(int i=0;i<str.size();++i)
    {
        sum*=16;
        sum+=mmap[str[i]];
    }
    cout<<sum<<endl;

    }

    return 0;
}

6.質數因子

不知道有沒有更高階的方法,我的理解就是,對於一個數來說,比如180
從2開始遍歷,如果能被2整除,那麼180/=2,並且輸出2,之後再拿90重複上述操作
直到變成1為止

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    long input;
    while(cin>>input)
    {
    while(input>static_cast<int>(1))
    {
        for(int i=2;i<=input;++i)
        {
        if(input%i==0)
        {
            input/=i;
            cout<<i<<" ";
            break;
        }

        }
    }
    cout<<endl;
    }
    return 0;
}

7.取近似值

輸出一個浮點數四捨五入的值,C++標準庫也有round``floor``ceil這樣的函式,
我的辦法比較土,轉成string以後提出小數點第一位然後再判斷:

#include <iostream>
using namespace std;
int main()
{
    double f;
    while(cin>>f)
    {
    string str(std::to_string(f));
    int pos=str.find('.');
    int v1=std::stoi(str.substr(0,pos));
    int v2=str[pos+1]-'0';
    cout<< (v2>4?(v1+1):v1)<<endl;
    }
    return 0;
}

8.合併表記錄

這題不復雜,就是麻煩,大概意思就是輸入(key-value)對,
key相同的要合併,合併就是將value加起來,最後將這些(key-value)對升序排行
我的做法定義一個結構體,然後重寫operator==std::sort的比較函式,實際上定義一個unordered_map<int,int>會更簡單吧。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
struct pair_
{
    int key;
    int value;

    bool operator==(const struct pair_ &x)
    {
    return x.key==this->key;
    }
};
typedef vector<pair_> Pairs;
class comp{
    public:
    bool operator()(const pair_&a,const pair_&b)
    {
        return a.key<b.key;
    }
};
int main(int argc,char **argv)
{
    int N;
    Pairs pairs;
    pairs.reserve(1024);
    while(cin>>N)
    {
    Pairs::iterator it;
    for(int i=0;i<N;++i)
    {
        pair_ tmp;
        cin>>tmp.key>>tmp.value;
#if 1
        if((it =find(pairs.begin(),pairs.end(),tmp))!=pairs.end())
        it->value+=tmp.value;
        else
        pairs.push_back(tmp);
#endif
    }
    sort(pairs.begin(),pairs.end(),comp());
    for(int i=0;i<pairs.size();++i)
    {
        cout<<pairs[i].key<<" "<<pairs[i].value<<endl;

    }


    }
    return 0;
}

9.提取不重複整數

簡單粗暴的做法,定義一個unordered_set把出現過的放進去
從後往前迭代一次就可以了。

#include <iostream>
#include <string>
#include <unordered_set>

using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
    string str=to_string(n);
    unordered_set<char>s;
    int sum=0;
    for(int i=str.size()-1;i>=0;--i)
    {
        if(s.find(str[i])==s.end())
        {
        sum*=10;
        sum+=(str[i]-'0');
        s.insert(str[i]);
        }
    }
    cout<<sum<<endl;;
    }
    return 0;
}

10.字元個數統計

統計ACSII碼範圍(0-127)的字元,重複的字元只統計一次
比如aaa只統計為1

我的做法依然簡單粗暴,用一個unordered_set

其實只需要一個127大小的char陣列,出現就賦值1,最後統計即可

#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;
int main()
{
    string str;
    unordered_set<char>s;
    std::getline(cin,str);

    int count=0;
    for(int i=0;i<str.size();++i)
    {
    if(str[i]<128&&str[i]>=0)
    {
        if(s.find(str[i])==s.end())
        {
        ++count;
        s.insert(str[i]);
        }
    }
    }
    cout<<count<<endl;

    return 0;
}

相關推薦

試題筆記

馬上華為提前批開始了,嚇得我趕緊上牛客網刷題,記錄如下: 所有程式碼都在github 1.字串最後一個單詞的長度 一段英文字串中最後一個單詞的長度。 題目比較簡單,做法有很多: 比如, 可以放到stringstream裡面split,拿到最後一個單詞

試真

1.字串最後一個單詞的長度 題目描述 計算字串最後一個單詞的長度,單詞以空格隔開。 輸入描述 一行字串,非空,長度小於5000。 輸出描述 整數N,最後一個單詞的長度。 輸入示例 hello world 輸出示例 5 程式碼 impo

LeetCode筆記

問題一:兩數相加 給定兩個非空連結串列來表示兩個非負整數,位數按照逆序方式儲存,它們的每個節點只儲存單個數字,將兩數相加返回一個新的連結串列。 例項: 輸入:(2 -> 4->3) + (5->6->4) 輸出:7 -> 0 - >

網研究生機試題記錄

牛客網:清華大學 1.成績排序 這題我一開始採用的是排序演算法,排序最快的時間複雜度為O(nlogn)。所以這裡換一種思路,既然有100分,不如建立一個二維vector,在每一份的vector上push上姓名,這樣時間複雜度降到O(n)。 順便複習一下排序的時間代價和分類。

劍指offer記錄

1.二維陣列查詢 本題的關鍵就在於二維陣列具有一定的特性: 從左往右,從上往下呈遞增序列。 如果二次遍歷,就失去了這個題目的意義因為複雜度是O(n2) 對於這個矩陣來說,左上角的值a(0,0)一定為最小值,右下角的值a(m,n)一定是最大值,當與ta

試題--高鐵換乘Floyed演算法

題目: 已知2條地鐵線路,其中A為環線,B為東西向線路,線路都是雙向的。經過的站點名分別如下,兩條線交叉的換乘點用T1、T2表示。編寫程式,任意輸入兩個站點名稱,輸出乘坐地鐵最少需要經過的車站數量(含

筆記編程基礎

index -- 判斷 asc 疊加 加法 -i 元素 else 題目一:二維數組中的查找 題目描述: 在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,

c++網做筆記

一邊做題一邊思考,才能夠提高學習的效率。為了加深記憶,將每天做的題的筆記記錄在部落格上。 1. 字元陣列與字串 char a[] = {'a','b'}; char b[] = {"ab"}; b陣列比a陣列多一個‘\0’。b為字串常量,a為字元陣列。

Python筆記5- 秒轉化時間

題目: Write a function, which takes a non-negative integer (seconds) as input and returns the time in a human-readable format (HH:MM:SS)

LeetCode記錄

LeetCode刷題記錄(一) 最近開始在LeetCode上面做題,想想應該做一個記錄,以便以後看到類似的問題及時查閱,同時也能夠將做題時的思路記錄下來,將這些思路整理歸納,形成一套我自己的解題思路。當然,演算法題只做一次是不夠的,需要多次的練習,可能每次的想法都不太一樣,在這裡我只

路由器OSPF多區域配置

OSPF(Open Shortest Path First開放式最短路徑優先)是一個內部閘道器協議(Interior Gateway Protocol,簡稱IGP),在企業內網當中應用非常廣泛,本位主要介紹OSPF多區域配,以及OSPF鏈路狀態資料庫基本分析,OSPF多區域的產生可以增強網路的可擴充套件

LeetCode筆記

4. 兩個排序陣列的中位數 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 。 請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 O(log (m+n)) 。 你可以假設 nums1 和 nums2 不同時為空。 示例 1: nums1 =

Rrui的Leetcode筆記

102. 二叉樹的層次遍歷 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode

Rrui的Leetcode筆記

225. 用佇列實現棧 class MyStack { public: /** Initialize your data structure here. */ queue<int> a; int k=0; MyStack

Rrui的Leetcode筆記

388. 檔案的最長絕對路徑 class Solution { public: int lengthLongestPath(string input) { int res = 0, n = input.size(), level = 0;

Rrui的Leetcode筆記

448. 找到所有陣列中消失的數字 class Solution { public: vector<int> findDisappearedNumbers(vector<int>& nums) { vector&l

LeetCode 指南:為什麼要

雖然刷題一直飽受詬病,不過不可否認刷題確實能鍛鍊我們的程式設計能力,相信每個認真刷題的人都會有體會。現在提供線上程式設計評測的平臺有很多,比較有名的有 hihocoder,LintCode,以及這裡我們關注的 LeetCode。 程式碼提交曲線 LeetCode

Python筆記2- 取5位大數字

In the following 6 digit number: 283910 91 is the greatest sequence of 2 digits. Complete the solution so that it returns the largest five digit number fo

Python筆記4- 字串重組

題目: Complete the method/function so that it converts dash/underscore delimited words into camel casing. The first word within the output

Python筆記3- 16進位制和ascii碼互轉

今天看了下等級標示,原來kyu上面還有dan的等級,升級路漫漫,今天是5kyu題目 題目: Write a module Converter that can take ASCII text and convert it tohexadecimal. The class