文章目录
- 2023/5/6 华为第一题:喷墨水
- 2023/5/16 华为第二题:表达式计算
2023/5/6 华为第一题:喷墨水
模拟题,代码未提交,样例过
- 输入处理:双字节十六进制转二进制
十六进制转十进制再转二进制,读取多个字符串多次处理,给数组arr赋值,长度不足就数组首部即字符末尾用0填充 - 核心逻辑:分向右,向左移动分别处理
for循环遍历数组arr,从0开始每次向右/左移动i个位置,检查是否满足条件,满足返回此时移动的步数; - check函数逻辑:
判断不移动和移动了之后,对应arr数组的下标是否为1,为1的话说明此处可以喷墨,步长step+1,最终判断step是否等于数组长度,若是返回true - 输出处理
判断左/右移动标记是否为-1,若不是-1,就返回更新后的数组
package ZhenTi;
import java.sql.SQLOutput;
import java.util.Scanner;
/**
* 5/6喷墨水
*/
public class Solution29 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
String[] strs = sc.nextLine().split(" ");
int[] arr = new int[n];
for(int i=0,c=0; i<strs.length && c<n; i++){
//十六进制变十进制变二进制,前两位0x为前缀
char[] bs = Integer.toBinaryString(Integer.parseUnsignedInt(strs[i].substring(2),16))
.toCharArray();
//长度不足16,后边的用0填充
for(int j=0;j<16-bs.length&&c<n;j++){
arr[c++] = 0;
}
for(int j=0;j<bs.length&&c<n;j++){
arr[c++] = bs[j]- '0';
}
}
// System.out.println(arr);
int ans,ans1=-1,ans2=-1;
//检查向右移动,从0开始遍历,只求最短的,找到了就返回
for(int i=0;i<n;i++){
if(check(arr,i,0)){
ans1 = i;
break;
}
}
//检查向左移动
for(int i=0;i<n;i++){
if(check(arr,i,1)){
ans2 = i;
break;
}
}
ans = (ans1==-1?0:1) + (ans2==-1?0:1);
System.out.println(ans);
if(ans1!=-1){
System.out.println("+" + ans1);
int[] res = new int[n];
for(int i=0;i<n;i++){
if(arr[i]==0){
//输出要求堵塞的孔开启即可,因此先找到堵塞的孔处理
if(arr[i]==0){
res[i-ans1] = 1;
}
}
}
for(int item:res){
System.out.print(item);
}
System.out.println();
}
if(ans2!=-1){
System.out.println("-" + ans2);
int[] res = new int[n];
for(int i=0;i<n;i++){
if(arr[i]==0){
//输出要求堵塞的孔开启即可,因此先找到堵塞的孔处理
if(arr[i]==0){
res[i+ans2] = 1;
}
}
}
for(int item:res){
System.out.print(item);
}
}
}
//cnt表示位移步数,dir表示移动方向,0表示向右移动,1表示向左移动
public static boolean check(int[] arr,int cnt,int dir){
int ans = 0;
int n = arr.length;
if(dir==0){//向右移动
for(int i=0,j;i<n;i++){
//两种情况:不移动可以实现喷墨或者向右移动cnt位也能实现喷墨
if(arr[i]==1 || ((j=i-cnt)>=0&&arr[j]==1 )){
ans++;
}else{
break;
}
}
}else{//向左移动
for(int i=0,j;i<n;i++){
//两种情况:不移动可以实现喷墨或者向左移动cnt位也能实现喷墨
if(arr[i]==1 || ((j=i+cnt)<n&&arr[j]==1 )){
ans++;
}else{
break;
}
}
}
return ans == n;//如果ans等于数组长度n就说明喷墨成功
}
}
2023/5/16 华为第二题:表达式计算