剑指Offer 简单题1(数学、数组、字符串)

JZ48 不用加减乘除做加法

题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

输入

1,2

返回值

3

#include<iostream>
using namespace std;
int Add(int num1, int num2) 
{
	return (num2 == 0) ? num1 : Add(num1 ^ num2, (num1 & num2) << 1);
}
int main()
{
	int num1, num2;
	cin >> num1 >> num2;
	cout << Add(num1, num2);
	return 0;
}

JZ51 构建乘积数组

题目描述
给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)
对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。

输入

[1,2,3,4,5]

返回值

[120,60,40,30,24]

#include<iostream>
#include<vector>
using namespace std;
vector<int> multiply(const vector<int>& A)
{
	int length = A.size();
	vector<int>B;
	int mul = 1;
	for (int i = 0; i < length; ++i)
	{
		mul *= A[i];
	}
	B.push_back(mul);
	for (int i = 1; i < length - 1; ++i)
	{
		int sum = 1;
		for (int j = 0; j < length; ++j)
		{
			if (i != j)
			{
				sum *= A[j];
			}
		}
		B.push_back(sum);
	}
	int mul2 = 1;
	for (int i = 0; i < length - 1; ++i)
	{
		mul2 *= A[i];
	}
	B.push_back(mul2);
	return B;
}
int main()
{
	vector<int>A = { 1,2,3,4,5 };
	vector<int>result = multiply(A);
	for (int i = 0; i < result.size(); ++i)
	{
		cout << result[i] << " ";
	}
	return 0;
}

JZ34 第一个只出现一次的字符

题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
输入

“google”

返回值

4

#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<map>
using namespace std;
int FirstNotRepeatingChar(string str) 
{
	map<char, int>m;
	for (int i = 0; i < str.length(); ++i)
	{
		m[str[i]]++;
	}
	for (int i = 0; i < str.length(); ++i)
	{
		if (m[str[i]] == 1)
		{
			return i;
		}
	}
	return -1;
}
int main()
{
	string str;
	cin >> str;
	cout << FirstNotRepeatingChar(str);
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值