#每日一题2018/3/30

Leetcode 30

看到一个无比无比聪明的做法,太佩服了。

思路:将words数组中每一个字符串编码为一个特定数字,使整个words数组加起来的和唯一。

使用unordered_map存储,那么为了和是唯一的,就使用左移,使每一个都为2的指数(1,2,4,8)

遍历被检测的字符串,将每一个能对应上words数组中某个字符串的位置,初始化为该字符串对应的数字

再次遍历被检测字符串,使用二层循环,遍历字符串中所有长度为words字符串字符长度的子串,只要子串满足数字之和等于words数组之和,即满足要求。

太巧妙了!善用左移的属性

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        int slength=words[0].size();
		int blength=words.size();
		unordered_map<string,int> mapping;
		for(int i=0;i<blength;i++)
		{
			int j=1;
			mapping[words[i]]=j<<i;
		} 
		int total=0;
		for(int i=0;i<blength;i++)
		{
			total+=mapping[words[i]];
		}
		vector<int> list;
		vector<int> result;
		for(int i=0;i<s.size()-slength+1;i++)
		{
			list.push_back(mapping[s.substr(i,slength)]);
		}
		for(int i=0;i<s.size()-slength*blength+1;i++)
		{
			int sum=0;
			for(int j=0;j<blength;j++)
			{
				sum+=list[i+j*slength];
			}
			if(sum==total)
			{
				result.push_back(i);
			}
			
		}
		return result;
    }
};


leetcode 31

觉得数据有漏洞?

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int size=nums.size();
        int end=size-1;
        while(end>0)
        {
        	if(nums[end-1]<nums[end])
        	{
        		break;
			}
			else
			{
				end--;
			}
		}
		if(end==0)
		{
			sort(nums.begin(),nums.end());
		}
		else
		{
			int min=nums[end];
			int index=end;
			//cout<<nums[end]<<"   "<<end<<endl;
			for(int i=size-1;i>end;i--)
			{
				if(nums[i]<=min&&nums[i]>nums[end-1])
				{
                	min=nums[i];
                	index=i;
            	}
			}
			swap(nums[index],nums[end-1]);
            sort(nums.begin()+end,nums.end());
		}
    }
};

leetcode32

对我来说难在正确理解题意……

基于python实现的粒子群的VRP(车辆配送路径规划)问题建模求解+源码+项目文档+算法解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。
### 关于C语言选择题练习的相关资源 对于希望提高C语言能力的学习者来说,通过做选择题可以快速掌握基础知识并检验自己的理解程度。以下是关于C语言选择题的一些推荐方向和相关内容: #### 资源推荐 1. **《C语言入门必刷100题》系列** 这一系列包了丰富的编程实践题目[^1],虽然主要以实际编码为主,但在其中也穿插了一些理论性的选择题,帮助巩固基本概念。 2. **《C C++最全每日亿题》** 此系列不仅提供了大量的编程实战训练,还特别针对初学者设计了许多基础知识点的选择题练习[^4]。这些题目覆盖了变量、数据类型、控制结构等多个方面。 3. **字符串处理专题** 题目描述中提到的一个典型例子是统计字符串中的不同字符种类[^2]。这类问题可以通过设置多项选项来考察学生对条件判断的理解以及逻辑思维能力。 4. **算法与程序设计教程** 结合具体实例进行讲解的文章通常会附带测试性质的小测验[^3],这对于想要全面了解某一特定主题下的各种可能性非常有帮助。 #### 示例代码片段 下面给出一段简单的示例代码用于展示如何利用if-else语句完成基于条件分支的操作: ```c #include <stdio.h> int main() { int i; for (i = 1; i <= 10; ++i) { if (i % 3 != 0){ printf("%d ", i); } else{ continue; } } return 0; } ``` 该段代码展示了当`i`能够被3整除时跳过打印操作的过程。 #### 总结 为了更好地准备C语言考试或者自我评估水平,建议综合运用上述提到的各种资源来进行系统化的复习和练习。同时注意积累常见错误案例以便加深印象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值