牛客网刷题18(2道题)

35.最大乘积

题目链接
https://www.nowcoder.com/practice/5f29c72b1ae14d92b9c3fa03a037ac5f?tpId=90&&tqId=30776&rp=14&ru=/activity/oj&qru=/ta/2018test/question-ranking
题目描述
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述
输入共2行,第一行包括一个整数n,表示数组长度
第二行为n个以空格隔开的整数,分别为A1,A2, … ,An
输出描述
满足条件的最大乘积
示例1
输入
4
3 4 1 2
输出
24
题目分析

  1. 把整数从小到大排序。
  2. 取最大3个数的乘积。
  3. 取最大一个数和最小两个数乘积。(考虑到存在绝对值最大的两个负数)
  4. 取两个乘积中的最大值作为最后结果。
  5. 注意:定义数据类型时要定义为:long long型。
#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
	int n;
	long long num[100000];
	while(scanf("%d",&n)!=EOF){
		for(int i=0;i<n;i++){
			scanf("%lld",&num[i]);
		}
		//从小到大排序
		sort(num,num+n);
		long long sum;
		long long s1=1;
		//最大3个数乘积
		for(int j=n-1;j>=n-3;j--){
			s1 *=num[j];
		}
		//最大一个数和最小两个数乘积
		long long s2 = num[n-1];
		for(int j=0;j<2;j++){
			s2 *=num[j];
		}
		//取两个乘积中最大值
		sum = max(s1,s2);
		printf("%lld\n",sum);
	}	
	return 0;
} 

36.字符集合

题目链接
https://www.nowcoder.com/practice/784efd40ed8e465a84821c8f3970b7b5?tpId=49&&tqId=29297&rp=14&ru=/activity/oj&qru=/ta/2016test/question-ranking
题目描述
输入一个字符串,求出该字符串包含的字符集合
输入描述
每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。
输出描述
每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。
示例1
输入
abcqweracb
输出
abcqwer
题目分析

  1. 判断输入的字符串长度是否大于100,若大于100,则定义字符串长度为100。
  2. 定义新数组用来存放字符。
  3. 判断新数组中是不是第一次出现将要输入的字符串,若是第一次,则保存到新数组中。(indexOf)
  4. 把字符串数组变成字符串。(join(’’))
  5. 注意使用while(input = readline())多次输入。
var input;
while(input = readline()){
    var arr = [];
    if(input.length > 100) {
            input.length = 100}
    for(var i=0;i<input.length;i++){
        if(arr.indexOf(input[i])<0){
           arr.push(input[i]);
        }
    }
    var res = arr.join('');
    console.log(res);
}
发布了22 篇原创文章 · 获赞 0 · 访问量 359

猜你喜欢

转载自blog.csdn.net/weixin_41796393/article/details/104337363