牛客网华为机试链接
1 汽水瓶
算法思路:
- 如果n=3那么就可以换一瓶汽水,n=3的倍数可以每3瓶换一瓶汽水,如果是6瓶就可以换1+1+1(最后一个1是向老板借一个瓶子喝完后再还给老板),如果是9瓶就可以换1+1+1+1,如果是12瓶就可以换1+1+1+1+1+1…,如果是15瓶,可以换15/3=5,5/2=2,换5+2瓶。
- 当n>=3时,每3瓶汽水换一瓶,n = 汽水喝完后的瓶子数+没能换汽水的瓶子数,继续计算直到n<3。
- 如果n=2那么就可以向老板借一个瓶子,喝完后再还给老板
- 输出结果
- PS:其实从1中可以总结出一个规律,即最后喝到的汽水瓶数是最初拥有的瓶子数/2取整,因为每2个瓶子就能换到一瓶汽水
#include <iostream>
using namespace std;
//方法一
int main() {
int n;
while(cin>>n){
if(n == 0){
break;
}
int result = 0;
while(n >= 3){
result += n / 3;
n = n / 3 + n % 3;
}
if(n == 2){
result++;
}
cout<<result<<endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
#include <iostream>
using namespace std;
//方法二
int main() {
int n;
while(cin>>n){
if(n == 0){
break;
}
cout<<n/2<<endl;
}
return 0;
}
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int n = in.nextInt();
if(n != 0){
int result = 0;
while(n >= 3){
result += n / 3;
n = n/3 + n%3;
}
if(n == 2) result++;
System.out.println(result);
}
}
}
}
2 明明的随机数
利用STL库中的set的特性完成题目,即set中的key值是有序的且不允许重复
#include <iostream>
#include<vector>
#include<unordered_map>
#include<set>
#include<algorithm>
using namespace std;
int main() {
int n;
cin>>n;
//vector<int> num;
set<int> num;
//读入n个数据
while (n--) {
int val;
cin>>val;
num.emplace(val);
}
//对result先排序再去重
//排序
// sort(num.begin(),num.end());
for(auto an:num){
cout<<an<<endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
//Treeset中key值有序且不能重复
TreeSet set = new TreeSet();
for(int i = 0; i < n;i++){
int val = in.nextInt();
set.add(val);
}
Iterator ite = set.iterator();
while(ite.hasNext()){
System.out.println((ite.next()));
}
}
}
3 进制转换
进制转换,从低位到高位计算
#include <iostream>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int main() {
string input;
cin>>input;
int n = input.size();
int ans = 0;
for(int i = n-1;i >= 2;i--){
switch(input[i]){
case 'A': ans += 10 * pow(16,n-1-i);break;
case 'B': ans += 11 * pow(16,n-1-i);break;
case 'C': ans += 12 * pow(16,n-1-i);break;
case 'D': ans += 13 * pow(16,n-1-i);break;
case 'E': ans += 14 * pow(16,n-1-i);break;
case 'F': ans += 15 * pow(16,n-1-i);break;
default: ans += (input[i]-'0') * pow(16,n-1-i);break; //input[i]-'0'将'0'~'9'转成数字
}
}
cout<<ans<<endl;
return 0;
}
// 64 位输出请用 printf("%lld")
import java.util.Scanner;
/** * Created by user on 2017/4/18. */
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s = new String(sc.nextLine()); //16进制输入为字符串输入
int num = 0;
for (int i = 2; i < s.length(); i++) { //i=2,用来跳过“0x”
if (s.charAt(i) == 'A') {
num = num * 16 + 10; //16进制转化,num*16,ABCDEF分别代表10,11,12,13,14,15;
} else if (s.charAt(i) == 'B') {
num = num * 16 + 11;
} else if (s.charAt(i) == 'C') {
num = num * 16 + 12;
} else if (s.charAt(i) == 'D') {
num = num * 16 + 13;
} else if (s.charAt(i) == 'E') {
num = num * 16 + 14;
} else if (s.charAt(i) == 'F') {
num = num * 16 + 15;
} else {
num = num * 16 + Integer.parseInt(String.valueOf(s.charAt(i)));
//把(char)s[i]化为(int) s[i]
}
}
System.out.println(num); //输出转化后的num
}
}
}
本文总结了华为机试中涉及的汽水瓶问题、明明的随机数问题以及进制转换问题的算法思路。对于汽水瓶问题,通过分析得出最后喝到的汽水瓶数是最初瓶子数的一半取整;明明的随机数问题利用STL库中的set解决;进制转换则从低位到高位进行计算。
7万+

被折叠的 条评论
为什么被折叠?



