用堆解决最小k个数
/*class Solution {
public:
vector GetLeastNumbers_Solution(vector input, int k) {
int len=input.size();
if(len<=0||k>len||k<=0) return vector();
vector res(input.begin(),input.begin()+k);
//建堆
make_heap(res.begin(),res.end());
for(int i=k;i GetLeastNumbers_Solution(vector input, int k) {
vector result;
if(input.size()==0||k==0||k>input.size()){
return result;
}
for(int i=input.size()/2-1;i>=0;i--){//初始化堆
adjustHeap(input,i,k);
}
int i=k;
while(iinput[i]){
int temp=input[i];
input[i]=input[0];
input[0]=temp;
adjustHeap(input,0,k);
i=k;
}else {
i++;
}
}
for(int i=0;i&input,int i,int length){//堆调整
int child=i*2+1;
if(childinput[child]){
child=child+1;
}
if(input[child]>input[i]){
int temp=input[i];
input[i]=input[child];
input[child]=temp;
adjustHeap(input,child,length);
}
}
}
void heapSort(vector&input,int length){//堆排序
for(int i=length/2-1;i>=0;i--){//初始化堆
adjustHeap(input,i,length);
}
for(int i=length-1;i>0;i--){
int temp=input[i];
input[i]=input[0];
input[0]=temp;
adjustHeap(input,0,i);
}
}
};
倒置和删除字符串
#include
#include
#include
#include
using namespace std;
int main()
{
string s1,s2;
getline(cin,s1);
getline(cin,s2);
for(int i=0;i
#include
#include
using namespace std;
void reverse(char* start, char* end)
{
while(start < end)
{
char temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
int main()
{
char input[1000];
gets(input);
// 翻转整个句子
reverse(input, input + strlen(input) - 1);
// 翻转单词
char* start = input;
while(*start != '\0')
{
char *end = start;
while(*end != ' ' && *end != '\0')
end++;
reverse(start, end-1);
if(*end != '\0')
start = end + 1;
else
start = end;
}
cout<
给你两个集合,要求{A} + {B}。 注:同一个集合中不会有两个相同的元素
#include
#include
#include
using namespace std;
int main(void)
{
int n, m;
while (cin >> n, cin >> m)
{
set st;
int num;
for (int i = 0; i < n + m; ++i)
{
cin >> num;
st.insert(num);
}
int size = st.size();
set::iterator it = st.begin();
for (int i = 0; i < size - 1; ++i)
{
cout << *it << " ";
++it;
}
cout << *it << endl;
}
return 0;
}
有一个X*Y的网格,要在此网格上从左上角到右下角,只能走格点且只能向右或向下走。请设计一个算法,计算小团有多少种走法。给定两个正整数int x,int y,请返回小团的走法数目。
/*动态规划:
对于x*Y网格,dp[i][j]表示(i,j)位置一共有多少种走法,
由于只能向左和向右走,所以第一列和第一行所有位置的走法都是1,即dp[i][0]=1,dp[0][j]=1(0=
#include
using namespace std;
int main()
{
int x, y;
cin >> x >> y;
int dp[11][11];
for (int j = 0; j <= y; j++)
dp[0][j] = 1;
for (int i = 0; i <= x; i++)
dp[i][0] = 1;
for (int i = 1; i <= x; i++)
{
for (int j = 1; j <= y; j++)
{
dp[i][j] = dp[i - 1][j] + dp[i][j-1];
}
}
cout << dp[x][y] << endl;
}
合并相同price字段
#include
using namespace std;
int main()
{
int dataPrices[10000] = {0};
int start, end, price;
while(cin>>start>>end>>price)
{
int min = start, max = end;
for(int i = start; i <= end; i++)
dataPrices[i] = price;
while(cin>>start>>end>>price)
{
min = min < start ? min : start;
max = max > end ? max : end;
for(int i = start; i <= end; i++)
dataPrices[i] = price;
}
int status = 0,p_tmp;
for(int i = min; i <= max; i++)
{
if(status ==0)
{
p_tmp = dataPrices[i];
if(p_tmp !=0)
{
cout<<"["<
给定一个英文字符串,请写一段代码找出这个字符串中首先出现三次的那个英文字符
#include
#include
#include
using namespace std;
int main()
{
string s;
while(getline(cin,s)) //获取一行的数据 接受一个字符串,可以接收空格并输出,需包含#include
{
int hashtable[256]={0};
for(int i=0;i
#include
#include
#include
给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。输入325 1 输出35
#include
#include
using namespace std;
int main()
{
string s;
int len,i;
while(cin>>s>>len){
i=1;
//len为需要删除的数的数量,用while循环判断
while(len--){
//slen为输出的数字的位数
int slen = s.length();
for(i=0;i
处理环的问题,输入字符串,求含有ABCDE的最短子串。
#include
#include
#include
#include
给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词之间只有一个空格,前后没有空格。 比如: (1) “hello xiao mi”-> “mi xiao hello”
#include
#include
#include
using namespace std;
int main() {
string words;
while (getline(cin, words)) {
reverse(words.begin(), words.end());
unsigned i = 0, j = i;
while (i < words.size()) {
while (i < words.size() && words[i] != ' ')
++i;
reverse(words.begin() + j, words.begin() + i);
j = ++i;
}
cout << words << endl;
}
return 0;
}
链表回文
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
// write code here
if(A==NULL)
return false;
else if(A->next==NULL)
return true;
//快慢指针找出中间节点
ListNode* quick=A;
ListNode* slow=A;
while(quick!=NULL&&quick->next!=NULL)
{
quick=quick->next->next;
slow=slow->next;
}
//反转
ListNode* p=slow->next;
ListNode* p1=p->next;
while(p!=NULL)
{
p->next=slow;
slow=p;
p=p1;
p1=p1->next;
}
while(A!=slow)
{
if((A->val)!=(slow->val))
{
return false;
}else{
if(A->next==slow)
{
return true;
}
A=A->next;
slow=slow->next;
}
}
return true;
}
};