牛客華為機試題刷題筆記(一)
馬上華為提前批開始了,嚇得我趕緊上牛客網刷題,記錄如下:
所有程式碼都在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::sort
、std::unique
、vector::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
將分割成:12345678
和90000000
方法也很多,比如可以用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