代码编织梦想

《剑指Offer》–算法

#include<iostream>
#include<vector>
using namespace std;


/*Q:数组中出现次数超过一半的数字?
R:res的票+1,非众数-1,根据题目的描述则一定有所有数字的票数和 > 0 ;
若数组的前 a 个数字的票数和 == 0 ,则数组剩余 (n-a) 个数字的票数和一定仍 > 0 ,
即后 (n-a)个数字的最多数仍为 res。(严格来说是超过一半的数)*/
int MoreThanHalfNum_Solution(vector<int> nums)
{
	int majority = nums[0];
	for (int i = 1, cnt = 1; i < nums.size(); i++) {
		cnt = nums[i] == majority ? cnt + 1 : cnt - 1;
		cout << "cnt" <<cnt<< endl;
		if (cnt == 0) {
			majority = nums[i];
			cnt = 1;
		}
	}

	int cnt = 0;
	for (auto val : nums) {
		if (val == majority)
			cnt++;
		
	}
    return cnt > (nums.size() / 2) ? majority : 0;

}

/*约瑟夫问题:圆圈中最后剩下的数?
有n个人围成一圈,从第一个人开始报数,
报到m的人出圈,剩下的人继续从1开始报数,
直到剩下一个人。问最后剩下的人的编号是多少?
还有 个比较简单的递归表达式 f(N,M)=(f(N−1,M)+M)%N
 */
 int LastRemaining_Solution(int n, int m) {
	 
	 cout << "************LastRemaining_Solution************" << endl;
	 int count = 0;
	 int i = 0;
	 int k = -1;	
	  int* a = new int[n];
	 for ( i = 0; i <n; i++)  //矩阵赋值为0;
		  a[i]=0;


	 while (count <n-1)
	 {
		  i = 0;
			 while (i < m)
			 {
				 k = (k + 1) % n;
				 if (a[k] == 0)
				 {
					 i++;
					 if (i % m == 0)
					 {
						 a[k] = -1;
						 count++;
					 }
				 }

			 }	
	 }

	 for (i = 0; i < n; i++)
		 cout << a[i];
	 

	 for (i = 0; i < n; i++) {
		 if (a[i] == 0) {
			 k= i + 1;
			 break;
		 }
	 }
     delete a;
	 return k;

}

void test_MoreThanHalfNum_Solution()
{
	vector<int> nums = { 1,1,1,4,4,4,5,5,5,5,5,5,5,5,5,5};
	int majority = MoreThanHalfNum_Solution(nums);
	cout << "数组出现最多的个数是:" << majority << endl;
}


// 从1到n整数中1出现的次数
int  NumberOf1Between1AndN_Solution(int n) {
	int cnt = 0;
	for (int m = 1; m <= n; m *= 10) {
		int a = n / m, b = n % m;
		cnt += (a + 8) / 10 * m + (a % 10 == 1 ? b + 1 : 0);
	}
	return cnt;
}

int main()
{
	
	cout << "test" << endl;
	int i= NumberOf1Between1AndN_Solution(13);
	cout <<i<< endl;

	getchar();
	return 0;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44830789/article/details/129812011

vector的几种初始化及赋值方式_yjunyu的博客-爱代码爱编程_java vector 初始化

vector的几种初始化及赋值方式: (1)不带参数的构造函数初始化 //初始化一个size为0的vector vector<int> abc; (2)带参数的构造函数初始化 //初始化size,但每个

C++ vector容器详解-爱代码爱编程

C++ vector容器详解 vector容器的基本概念1.vector的构造函数2.vector的赋值操作3.vector的容量与大小4.vector的插入和删除5.vector数据存取6.vector互换容器7.vector预留空间写在最后 vector容器的基本概念 功能:vector容器的功能和数组非常相似,使用时可以把它看成一

Vector-爱代码爱编程

Vector容器: Vector相比于 array 空间的运用更灵活, array是静态空间,一旦配置了就不能再改变。 而vector 是动态空间会随着数据量的增加 自动扩容(扩容机制 (重新开辟内存, 复制, 为什么二倍扩容)) 首先 自动扩容为什么是成倍的 而不是一次性增加多少数值这样子。 (原因:因为成倍扩容它的复杂度平均下来是 常数级, 而

C++ vector-爱代码爱编程

目录 1.vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用  1.2.1 vector的定义  1.2.2vector itertor的使用  1.2.3 vector空间增长问题  1.2.3vector增删查改 1.2.4 vector 迭代器失效问题。(重点) 1.2.5 vector 在OJ中的

c++ vector用法 入门必看 超详细_旧林墨烟的博客-爱代码爱编程

1、vector的作用 vector是最常用的容器之一,功能十分强大,可以储存、管理各种类型的数据。在很多情况下可以用来代替功能比较局限的普通数组,因为我们知道,普通数组只能实现一对一的映射而不能实现一对多的映射,vect

c++ vector用法详解_大神之路@cv的博客-爱代码爱编程_c++ vector操作

vector是STL的动态数组,可以在运行中根据需要改变数组的大小。 因为它以数组的形式储存,所以它的内存空间是连续的。 vector的头文件为#include<vector> 常用方法: 1.vecto

vector底层实现及应用注意事项-爱代码爱编程

文章目录 前言vector的实现原理vector的使用vector支持随机访问vector不适合做任意位置插入以及删除操作vector使用时注意事项 vector扩容vector扩容的倍数选择如何