第一题
猴子吃桃问题,每一天吃一半多一个,已知n天后剩余1个,问初始值。
例如:输入2 则初始值为10. 10 第一天吃一半 5 + 1个,剩余4个,第二天吃一半2+1个 剩余1个;
//直接递归即可 if(n == 0) return 1; return (calNum(n - 1) + 1) * 2;
第二题
给定一个方格。90*90 以原点为中心。 平均分成9个小宫格,大概如图所示吧
然后给你一个圆的圆心(保证圆心在整个大正方形内部)和半径,询问这个圆覆盖了几个小正方形。
我瞎做的,跑每个小正方形的每个整数点,判断该点到圆心与半径的大小关系,如该点到圆心距离小于半径则认为覆盖了。
static int calSquareNum(double x, double y, double r) { int[] pointX = new int[]{0, 30, 60, 90}; int[] pointY = new int[]{0, 30, 60, 90}; int ans = 0; for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++){ demo: for(int X = pointX[i]; X <= pointX[i + 1]; X++){ for(int Y = pointY[j]; Y <= pointY[j + 1]; Y++){ if(Math.sqrt((Math.pow(X - x, 2)) + Math.pow(Y - y, 2)) < r){ ans++; break demo; } } } } } return ans; }
第三题
给定两个数组,一个为入栈序列,一个为出栈序列。询问这个出栈序列是否合法。
直接模拟即可。就顺序读取入栈序列判断是否满足,不满足则入栈。
static boolean isValidPop(int[] push, int[] pop) { Stack<Integer> left = new Stack<>(); boolean flag = true; int index = 0; for(int i = 0; i < pop.length; i++){ if(!left.isEmpty() && left.peek() == pop[i]){ left.pop(); continue; } if(index < push.length && push[index] == pop[i]){ index++; continue; } boolean fflag = true; while(index < push.length){ if(pop[i] == push[index]){ index++; fflag = false; break; } else { left.add(push[index++]); } } if(fflag){ flag = false; break; } } return flag; }
第四题
给定一个数组,全排列这个数组,求满足相邻两位的是可以开方的个数。
因为C++的STL内置了全排列 所以偷懒直接用C++写了。
#include <bits/stdc++.h> using namespace std; int a[100010]; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; int ans = 0; cin >> n; for(int i = 0; i < n; i++){ cin >> a[i]; } sort(a, a + n); do{ bool flag = true; for(int i = 1; i < n; i++){ int val = a[i] + a[i - 1]; int tmpVal = sqrt(val); if(val != tmpVal * tmpVal){ flag = false; break; } } if(flag){ ans++; } }while(next_permutation(a, a + n)); cout << ans << endl; return 0; }
游戏体验良好2233333
全部评论
(5) 回帖