C++实现算法的一些巧妙点

1、c++计算字符串最后一个字符串长度

很有创意。,输入的数据,我们想计算最后一个,可以直接将字符串反转,计算第一个单词长度。这里 比较节省时间和空间的就是将字符串反转后,直接计算到第一个单词就好。且单词以空格划分,等遍历到第一个空格,就可以查出单词的长度了

#include 
#include 
using namespace std;

int main() {
    string a;
    getline(cin, a);
    int size = a.size( )-1; //去掉'\0' 的占位
    int count  = 0;
    reverse(a.begin(),a.end());   //将字符串反转逆序
    while(a[count] != ' ' && count <= size)
    {
        count++;
    }
    cout << count << endl;
}

C++实现算法的一些巧妙点_第1张图片

 2、多有序链表合并,

比较巧妙的可以使用容器存储链表,使用vector 存储链表的头节点,这样每一个元素都是一个链表的头节点。

再遍历链表使用multiset存储链表的值,因为多链表,可能有重复信息,可使用multiset。

再使用multiset中元素创建新链表。注意,这里struct 结构中使用 new listnode(val);  正好可以创建每个value的新结点。  参考leetcode大佬答案。不过注意空间和时间问题

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector& lists) {
        multiset list_value;
        for(auto &elem : lists){
            while(elem ){
                list_value.insert(elem->val);
                elem = elem->next;
            }
        }
        ListNode * newhead,*ret_head;
        newhead = ret_head =new ListNode();
        for(auto &newval : list_value){
            newhead->next = new ListNode(newval);
            newhead = newhead->next;
        }
        return ret_head->next;
    }
};

3、函数指针,将函数当作参数传输进其他函数中

这个应该是有一些方式,不过接触的最常用的一个就是,给pthread_create()函数传输线程入口函数,且,最后一个参数是线程入口函数的参数

   int add_two(int x, int y)
   {
       printf("x +y = %d\n", x+y);
       return x+y;
   }
 
  void test_func (int (*function)(int ,int ),  int args1, int args2)
  {
      (*function)(args1,args2);
  }
 
  int main()
  {
      test_func(add_two, 1, 2);
 
      return 0;
 
  }

        

 解释

1、实际上这个东西,没有特别难搞,add_two 是一个正常定义的函数,但是test_func函数需要传入的第一个参数比较特别,简单说,就是需要传入一个符合要求的函数的指针(此函数的参数是俩int;返回值是int,后面传入的俩args可以用来做我们传入的函数的参数,其他类型的参数看自己定义就行;但是这个需要我们人为的调用,就是函数体的部分),

2、写的 *function 是指向函数的指针(所以本质上我们需要传入一个符合这个形参要求的函数的指针就行,类似一个某类型变量的指针做形参,直接传输地址,就会自动找到这个函数) 

3、而在main中调用的时候,传入的就是函数名add_two,可以正常运行,改成以下截图中的格式也能正常运行

        C++实现算法的一些巧妙点_第2张图片

   到这里感觉有点问题了:函数名和函数的指针会不会是一样的东西?

                                        因为我们使用变量时,指针就是变量的地址值,变量的指针解引用后是变量值,类比在函数应该也差不多。但是,这个明显不对镜。

做了以下测试后:

        C++实现算法的一些巧妙点_第3张图片

        C++实现算法的一些巧妙点_第4张图片

这地址是一毛一样!!!!,也就是这个,完全能直接当个指针用

网上关于这个传参,有的会取地址,有的不会,都没啥问题,反正地址都一样,哪个写着感觉好看用哪个吧。

你可能感兴趣的:(c++,算法,开发语言)