總結?
其實算不得總結,lintcode這個在專題不會再更新了,準備秋招的時候大概看過一遍這個,有些還是很有用的,然後劍指offer差不多刷了一遍,過些天閒了我把劍指offer的刷題總結完畢,地址在:劍指offer刷題記C++。
下面是今年筆試時記錄的幾個題。
1. 複數卷積。
題目我就不念了,需要計算兩個複數序列的卷積,依次輸入10個複數,先實後虛,計算卷積後輸出。讀寫資料就不管了,直接上程式碼。
卷積原理自然不必多少,三步走:翻轉,移位,乘加。
#pragma warning (disable:4996);
// 本題為考試多行輸入輸出規範示例,無需提交,不計分。
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int min(int x, int y)
{
if (x < y)
return x;
else
return y;
}
int max(int x, int y)
{
if (x < y)
return y;
else
return x;
}
//複數類,只定義了建構函式,為了簡單資料也公有了
class FuShu {
public:
FuShu(int x, int y) :a(x), b(y) {}
int a;
int b;
};
//複數乘法
FuShu multiply(FuShu x, FuShu y)
{
FuShu res(0, 0);
res.a = x.a*y.a - x.b*y.b;
res.b = x.a*y.b + y.a*x.b;
return res;
}
//複數加法
FuShu add(FuShu x, FuShu y)
{
FuShu res(0, 0);
res.a = x.a + y.a;
res.b = x.b + y.b;
return res;
}
int main() {
//freopen("1.in","r",stdin);
vector<FuShu> data;
FuShu tmp(0, 0);
int x;
for (int i = 0; i < 20; i++) {
scanf("%d", &x);
if (i % 2 == 0) //實部
tmp.a = x;
else
tmp.b = x; //虛部
if (i>=1 && i % 2 == 1) //一開始這裡寫的大於1導致第一個數沒有push進來。
data.push_back(tmp);
}
vector<FuShu> a = vector<FuShu>(data.begin(), data.begin() + 5);
vector<FuShu> b = vector<FuShu>(data.begin() + 5, data.end());
int m = a.size();
int n = b.size();
FuShu cnt(0, 0);
vector<FuShu> res;
for (int i = 0; i<m+n-1; i++)
{
for (int k =max(0,i+1-5); k <= min(i,4); k++) //主要是k的起始條件需要注意。一開始都是從0開始的,後面才需要從(i+1)%5開始。
{
cnt = add(cnt, multiply(a[k], b[i - k]));
}
res.push_back(cnt);
cout << i << ": " << cnt.a << " " << cnt.b << endl;
cnt = FuShu(0, 0);
}
}
2. 求輸入字元中的數的和。
對於輸入的一串字串,提取其中的數字並輸出其和,字串的輸入可能是字母,標點,數字。
比如: A12N34 則和為12+34=46
比如: A1,2N34 則和為1+2+34=37
比如: -12A23 則和為-12+23=11
有多個 -
的話的 奇數個為負數,偶數個為正。
int main()
{
string str = "AB1d--2Bd12";
int sz = str.size();
int i = 0;
bool isPositive;
int cnt = 0;
int res = 0;
while(i<sz)
{
isPositive = true;
while (i < sz&&str[i] == '-')
{
isPositive = !isPositive;
i++;
}
while (i < sz&&str[i] >= '0'&&str[i] <= '9')
{
cnt = cnt * 10 + (str[i] - '0');
i++;
}
if (!isPositive) cnt = -cnt; //檢視累計,如果是正的,就是正的,如果是負的,那麼要變號
res += cnt;
cnt = 0; //清零
i++;
}
cout << res << endl;
return 0;
}
3. 三角形的數目。
給定一組數,全為正數,任意挑出三個數看是否可以組成三角形,如果可以就算一個計數,求所有可能的組合數,相同的數在不同的位置視為不同的組合。
排序之後,從數字末尾開始往前遍歷,將left指向首數字,將right之前遍歷到的數字的前面一個數字,然後如果left小於right就進行迴圈,迴圈裡面判斷如果left指向的數加上right指向的數大於當前的數字的話,那麼right到left之間的數字都可以組成三角形,這是為啥呢,相當於此時確定了i和right的位置,可以將left向右移到right的位置,中間經過的數都大於left指向的數,所以都能組成三角形,就說這思路叼不叼!加完之後,right自減一,即向左移動一位。如果left和right指向的數字之和不大於nums[i],那麼left自增1,即向右移動一位,參見程式碼如下:
int numOfTriangle(vector<int> &numbers)
{
int cnt = 0;
int sz = numbers.size();
sort(numbers.begin(),numbers.end());
for (int i = sz; i > 1; i--)
{
int left = 0;
int right = i-1;
while (left <= right)
{
if (numbers[left] + numbers[right] > numbers[i])
{
cnt += (right - left);
right--;
}
else
left++;
}
}
return cnt;
}
相關文章
- javaSE總結(轉+總結)Java
- 「比賽總結」AT ABC 358 總結
- 總結
- this總結
- ISP 連結總結
- 樹結構總結
- 團隊總結 - Beta版總結會議
- JavaScript基礎總結(三)——陣列總結JavaScript陣列
- docker 總結Docker
- 2024.11.26總結
- 今日總結
- buildadmin總結UILDA
- 11.19總結
- java總結Java
- webpack總結Web
- python總結Python
- 前端總結前端
- 今日總結~
- 2024.10.19總結
- misc總結
- 2024.10.10 總結
- 10.9總結
- 2024.10.12總結
- 10.2 總結
- 10.6 總結
- 20240915 總結
- 20240916總結
- 2024.8.29 總結
- 202408 總結
- 2024.8.11總結
- 安全總結
- 周總結
- 20240724總結
- 2024.7.29總結
- MP總結
- 2024.7 總結
- 20240627總結
- 3.14總結