标签:style blog http color os 使用 io for 数据
一般来说,合并两个已经有序的数组,首先是开一个能存的下两个数组的第三个数组,但是题目中已经说了,其中一个数组能全部存的下,显然就不应该浪费空间了。
从前往后扫的话,数据要存在大数组的前头,这样每次要把大数组的元素一次后移一位,显然不是什么好主意,所以我们从后往前存。
#include<iostream>
#include<cstdlib>
using namespace std;
int cc[10];
int tt[5];
void init()
{
    srand((unsigned)time(NULL));
    int num = rand() % 5;
    for(int i = 0; i < 5; i++)
    {
        cc[i] = num;
        num += rand() % 10 + 1;
    }
    num = rand() % 5;
    for(int i = 0; i < 5; i++)
    {
        tt[i] = num;
        num += rand() % 10 + 1;
    }
}
void merge()
{
    int i = 4, j = 4, idx = 9;
    while(i>=0 && j>=0)
    {
        if(cc[i] > tt[j])
            cc[idx--] = cc[i--];
        else
            cc[idx--] = tt[j--];
    }
    while(i>=0)
        cc[idx--] = cc[i--];
    while(j>=0)
        cc[idx--] = tt[j--];
}
int main()
{
    init();
    for(int i = 0; i < 5; i++)
        printf("%d ", cc[i]);
    putchar(10);
    for(int i = 0; i < 5; i++)
        printf("%d ", tt[i]);
    putchar(10);
    merge();
    for(int i = 0; i < 10; i++)
        printf("%d ", cc[i]);
    putchar(10);
    getchar();
    return 0;
}不能创建第三条链表,用上两种办法进行合并
#include <iostream>
using namespace std;
struct node{
    int data;
    node *next;
};
void CreateNode(node *head) // 创建带有头结点的有序单链表
{
    node *s = head;
    int val = rand() % 5 + 1;
    for (int i = 0; i < 5; i++)
    {
        val += rand() % 5 + 1;
        node *t = new node;
        t->data = val;
        t->next = NULL;
        s = s->next = t;
    }
}
void PrintNode(node *head)
{
    node *s = head;
    while (s = s->next)
        printf("%d ", s->data);
    putchar(10);
}
node* Merge_1(node *head1, node *head2) // 顺序扫描
{
    node *i = head1->next;
    node *j = head2->next;
    node *cc = new node;
    node *s = cc;
    while(i && j)
    {
        if(i->data < j->data)
        {
            s = s->next = i;
            i = i->next;
        }
        else
        {
            s = s->next = j;
            j = j->next;
        }
    }
    if(i)
        s->next = i;
    else
        s->next = j;
    return cc;
}
node* Merge_2(node *head1, node *head2) // 递归法
{
    if(head1 == NULL)
        return head2;
    if(head2 == NULL)
        return head1;
    node *cc = NULL;
    if(head1->data < head2->data)
    {
        cc = head1;
        cc->next = Merge_2(head1->next, head2);
    }
    else
    {
        cc = head2;
        cc->next = Merge_2(head1, head2->next);
    }
    return cc;
}
int main()
{
    srand((unsigned)time(NULL));
    
    node *LinkList1 = new node, *LinkList2 = new node;
    CreateNode(LinkList1);
    CreateNode(LinkList2);
    PrintNode(LinkList1);
    PrintNode(LinkList2);
    // LinkList1 = Merge_1(LinkList1, LinkList2);
    LinkList1->next = Merge_2(LinkList1->next, LinkList2->next);
    PrintNode(LinkList1);   // 合并后的链表存在1中
    getchar();
    return 0;
}
#include <iostream>
using namespace std;
struct node{
    int data;
    node *next;
};
void CreateNode(node *&head) // 创建不带头结点的有序单链表
{
    head = new node;
    head->data = rand() % 5 + 1;
    node *s = head, *t = NULL;
    for(int i = 0; i < 5; i++)
    {
        t = new node;
        t->data = s->data + rand() % 5 + 1;
        s = s->next = t;
    }
    s->next = NULL;
}
void PrintNode(node *head)
{
    node *s = head;
    while (s != NULL)
    {
        printf("%d ", s->data);
        s = s->next;
    }
    putchar(10);
}
void PrintNode_Reverse(node *head)
{
    if(head->next != NULL)
        PrintNode_Reverse(head->next);
    printf("%d ", head->data);
}
int main()
{
    srand((unsigned)time(NULL));
    
    node *LinkList;
    CreateNode(LinkList);
    PrintNode(LinkList);
    PrintNode_Reverse(LinkList);
    putchar(10);
    getchar();
    return 0;
}
参见博客:如何在O(1)的时间里删除单链表的结点
设两个指针,一个先向前走K步,然后两个指针同步移动,等先走的指针走到了末尾,后走的指针就在倒数第K个位置了。
#include <iostream>
using namespace std;
struct node{
    int data;
    node *next;
};
void CreateNode(node *&head) // 创建不带头结点的有序单链表
{
    head = new node;
    head->data = rand() % 5 + 1;
    node *s = head, *t = NULL;
    for(int i = 0; i < 10; i++)
    {
        t = new node;
        t->data = s->data + rand() % 5 + 1;
        s = s->next = t;
    }
    s->next = NULL;
}
void PrintNode(node *head)
{
    node *s = head;
    while (s != NULL)
    {
        printf("%d ", s->data);
        s = s->next;
    }
    putchar(10);
}
void find(node *head, int num)
{
    node *s = head, *t = head;
    for(int i = 0; i < num; i++)
        t = t->next;
    while(t)
    {
        s = s->next;
        t = t->next;
    }
    printf("place: %dth value:%d\n", num, s->data);
}
int main()
{
    srand((unsigned)time(NULL));
    
    node *LinkList;
    CreateNode(LinkList);
    PrintNode(LinkList);
    find(LinkList, 5);
    find(LinkList, 3);
    putchar(10);
    getchar();
    return 0;
}
用递归与非递归两种方法,注意检查链表只有一个结点的时候反转函数不会出错
#include <iostream>
using namespace std;
struct node{
    int data;
    node *next;
};
void CreateNode(node *&head) // 创建不带头结点的有序单链表
{
    head = new node;
    head->data = rand() % 5 + 1;
    node *s = head, *t = NULL;
    for(int i = 0; i < 10; i++)
    {
        t = new node;
        t->data = s->data + rand() % 5 + 1;
        s = s->next = t;
    }
    s->next = NULL;
}
void PrintNode(node *head)
{
    node *s = head;
    while (s != NULL)
    {
        printf("%d ", s->data);
        s = s->next;
    }
    putchar(10);
}
node* Reverse_1(node *head)  // 非递归
{
    node *s = head, *t = head->next;
    s->next = NULL;
    while(t != NULL)
    {
        node *r = t->next;
        t->next = s;
        s = t;
        t = r;
    }
    return s;
}
void Reverse_2(node *front, node *n, node *&head)  // 递归
{
    front->next = NULL;
    if(n != NULL)
        head = n;
    if(n != NULL && n->next != NULL)
        Reverse_2(n, n->next, head);
    if(n != NULL)
        n->next = front;
}
int main()
{
    srand((unsigned)time(NULL));
    
    node *LinkList;
    CreateNode(LinkList);
    PrintNode(LinkList);
    LinkList = Reverse_1(LinkList);
    // Reverse_2(LinkList, LinkList->next, *&LinkList);
    PrintNode(LinkList);
    putchar(10);
    getchar();
    return 0;
}
参见博客:用两个栈实现队列
#include <iostream>
using namespace std;
void BinarySearch(int cc[], int num, int key)// 数组, 数组个数, 待查数字
{
    int i = 0, j = num;
    int cnt = 0, mid = 0;
    while(i < j)
    {
        cnt++;
        mid = (i + j) >> 1;
        if(cc[mid] == key)
        {
            printf("%d %s, index: %d\n", cnt, cnt==1?"time":"times", mid);
            return;
        }
        else if(cc[mid] < key)
            i = mid;
        else
            j = mid;
    }
}
int main()
{
    int cc[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    BinarySearch(cc, 10, 3);
    getchar();
    return 0;
}
两种略微有些不一样的快排(传入参数不同)
#include <iostream>
using namespace std;
int cc[10];
void init()
{
    srand((unsigned)time(NULL));
    for(int i = 0; i < 10; i++)
    {
        int idx = rand()%10;
        while(cc[idx])
            idx = rand()%10;
        cc[idx] = i+1;
    }
}
void show()
{
    for(int i = 0; i < 10; i++)
        printf("%d ", cc[i]);
    putchar(10);
}
void QuickSort_1(int cc[], int num)
{
    int s = 0, t = num-1;
    int base = cc[0];
    if(num <= 1)
        return;
    while(s < t)
    {
        while(t > s && cc[t] >= base)
            t--;
        cc[s] = cc[t];
        while(s < t && cc[s] <= base)
            s++;
        cc[t] = cc[s];
    }
    cc[s] = base;
    QuickSort(cc, s);
    QuickSort(cc+s+1, num-s-1);
}
void QuickSort_2(int cc[], int l, int r)
{
    if(l >= r)
        return;
    int s = l, t = r;
    int base = cc[l];
    while(s < t)
    {
        while(t > s && cc[t] >= base)
            t--;
        cc[s] = cc[t];
        while(s < t && cc[s] <= base)
            s++;
        cc[t] = cc[s];
    }
    cc[s] = base;
    QuickSort_2(cc, l, s-1);
    QuickSort_2(cc, s+1, r);
}
int main()
{
    init();
    show();
    //QuickSort_1(cc, sizeof(cc)/sizeof(int));
    QuickSort_2(cc, 0, sizeof(cc)/sizeof(int)-1);
    show();
    getchar();
    return 0;
}
没明白这个题目的意思,我们就理解成两个小题好了:
(1)求一个int型数字的二进制位数,如6->110->3位数
(2)求这个int型数字的二进制中‘1‘的个数
#include <iostream>
using namespace std;
int main()
{
    int num;
    while(~scanf("%d", &num))
    {
        int bits = 0, cnt = 0;
        int val = num;
        while(val)
        {
            if(val & 1)
                cnt++;
            bits++;
            val>>=1;
        }
        printf("%d has %d bit and %d '1' in binary\n", num, bits, cnt);
    }
    return 0;
}
#include <iostream>
using namespace std;
int cc[10];
void init()
{
    srand((unsigned)time(NULL));
    for(int i = 0; i < 10; i++)
    {
        int idx = rand()%10;
        while(cc[idx])
            idx = rand()%10;
        cc[idx] = i+1;
    }
}
void show()
{
    for(int i = 0; i < 10; i++)
        printf("%d ", cc[i]);
    putchar(10);
}
void Sort(int cc[], int size)
{
    int s = 0, t = size-1;
    while(s < t)
    {
        while(s < t && (cc[s]&1))
            s++;
        while(t > s && !(cc[t]&1))
            t--;
        cc[s] ^= cc[t];
        cc[t] ^= cc[s];
        cc[s] ^= cc[t];
    }
}
int main()
{
    init();
    show();
    Sort(cc, sizeof(cc)/sizeof(int));
    show();
    getchar();
    return 0;
}
#include <iostream>
using namespace std;
char t[1000];
char p[100];
int f[100];
int cnt = 0;
void KMP()  //需要使用的参数是char t[]长串, char p[]模式串.
{
    int n = strlen(t);
    int m = strlen(p);
    /////计算模式串的失配边
    f[0] = f[1] = 0;
    for(int i = 1; i < m; i ++)
    {
        int j = f[i];
        while(j && p[i] != p[j])j = f[j];
        f[i+1] = p[i] == p[j]?j+1:0;
    }
    int j = 0;
    for(int i = 0; i < n; i ++)
    {
        while(j && t[i] != p[j]) j = f[j];
        if(p[j] == t[i])j ++;
        if(j == m)    //匹配成功
            cnt ++;
    }
}
int main()
{
    cnt = 0;
    gets(t);
    gets(p);
    KMP();
    if(cnt >= 1)
        printf("match!\n");
    else
        printf("not match!\n");
    getchar();
    return 0;
}#include <iostream>
using namespace std;
void CreateArray(int *cc, int num)
{
    srand((unsigned int)time(NULL));
    for(int i = 0; i < num; i++)
        cc[i] = rand() % 50;
}
int cmp(const void *a, const void *b)
{
    char *s1 = new char[10];
    char *s2 = new char[10];
    strcpy(s1, *(char**)a);
    strcat(s1, *(char**)b);
    strcpy(s2, *(char**)b);
    strcat(s2, *(char**)a);
    return strcmp(s1, s2);
}
void ConvertToMinString(int *cc, int len)
{
    char** str = (char**)new int[len];
    for(int i = 0; i < len; i++)
    {
        str[i] = new char[5];
        sprintf(str[i], "%d", cc[i]);
    }
    qsort(str, len, sizeof(char*), cmp);
    for(int i = 0; i < len; i++)
        printf("%s ", str[i]);
    putchar(10);
}
int main()
{
    int cc[5];
    CreateArray(cc, 5);
    ConvertToMinString(cc, 5);
    getchar();
    return 0;
}#include <iostream>
#include <queue>
using namespace std;
struct node{
    int val;
    node *left;
    node *right;
};
void insert(node *&root, int data)
{
    if(root == NULL)
    {
        root = new node;
        root->val = data;
        root->left = root->right = NULL;
        return;
    }
    if(root->val > data)
        insert(root->left, data);
    else
        insert(root->right, data);
}
node* build()
{
    node *root = NULL;
    insert(root, 10);
    for(int i = 8; i <= 12; i++)
    {
        if(i == 10)continue;
        insert(root, i);
    }
    return root;
}
void showTree(node *root)
{
    if(root == NULL) return;
    printf("%d ", root->val);
    showTree(root->left);
    showTree(root->right);
}
void Mirror_1(node *&root)    // 递归方法
{
    if(root == NULL) return;
    node *t = root->left;
    root->left = root->right;
    root->right = t;
    Mirror_1(root->left);
    Mirror_1(root->right);
}
void Mirror_2(node *&root)     // 非递归方法
{
    queue<node*> q;
    if(root != NULL)
        q.push(root);
    while(!q.empty())
    {
        node *n = q.front();
        q.pop();
        node *t = n->left;
        n->left = n->right;
        n->right = t;
        if(n->left != NULL)
            q.push(n->left);
        if(n->right != NULL)
            q.push(n->right);
    }
}
int main()
{
    node *root = build();
    showTree(root);putchar(10);
    Mirror_1(root);
    showTree(root);putchar(10);
    Mirror_2(root);
    showTree(root);putchar(10);
    
    getchar();
    return 0;
}
#include <iostream>
#include <map>
using namespace std;
struct node{
    int val;
    node *next;
};
node* buildFirTree()    // 第一个链表有20个节点
{
    node *root = new node;
    root->val = 1;
    node *s = root, *t = root;
    for(int i = 2; i <= 20; i++)
    {
        t = new node;
        t->val = i;
        s = s->next = t;
    }
    s->next = NULL;
    return root;
}
node* buildSecTree(node *firnode)// 第二个链表创建5个结点,然后接到第一个链表的第8个结点上
{
    node *root = new node;
    root->val = 11;
    node *s = root, *t = root;
    for(int i = 2; i <= 5; i++)
    {
        t = new node;
        t->val = 10 + i;
        s = s->next = t;
    }
    node *k = firnode;
    for(int i = 0; i < 7; i++)
        k = k->next;
    s->next = k;
    return root;
}
void disp(node *root)
{
    node *t = root;
    while(t)
    {
        printf("%d ", t->val);
        t = t->next;
    }
    putchar(10);
}
node *GetFirstCommonNode(node *fir, node *sec)
{
    map<long, bool> mp;
    mp.clear();
    while(fir && sec)
    {
        if(mp[(long)fir] == true)
            return fir;
        mp[(long)fir] = true;
        fir = fir->next;
        if(mp[(long)sec] == true)
            return sec;
        mp[(long)sec] = true;
        sec = sec->next;
    }
    return NULL;
}
int main()
{
    node *fir = buildFirTree();
    printf("First linklist: ");disp(fir);
    node *sec = buildSecTree(fir);
    printf("second linklist: ");disp(sec);
    node *common = GetFirstCommonNode(fir, sec);
    if(common != NULL)
        printf("common node is: %d\n", common->val);
    else
        printf("There is no common node\n");
    getchar();
    return 0;
}标签:style blog http color os 使用 io for 数据
原文地址:http://blog.csdn.net/hactrox/article/details/38775209