小米现场笔试题

前两天去小米的宣讲会参加了现场笔试,只有三道编程题,不算难,但在短时间内准确做对感觉还是不太容易的,笔试的时候就不小心出了一些小错误。老惯例,把题目再做一遍记下来,不足之处欢迎指正。


1. 求序列{A, B, C, ... , Z, AA, AB, AC, ... , AZ, BA, BB, ... , AAA, AAB, ...} 的第N项。

思路:此题考核的是将十进制数N转化成二十六进制表示,需要注意的是,此二十六进制表示法不含零元。

代码:

void test1(int n)
{
    string s = "";
    while(n > 0)
    {
        s = (char)('A' + (n - 1) % 26) + s;
        n = (n - 1) / 26;
    }
    cout << s << endl;
}


2. 对图像进行填充操作:

    用二维数组表示图,不同数字代表不同的颜色,编写函数fillWithColor(int x, int y, Color c),对图像进行颜色填充操作,即将(x, y)位置及预期相连的同色区域的颜色改为c,其中x为行,y为列。

class image{

Color getPixel(int x, int y);

void setPixel(int x, int y, Color c);

int getWidth();

int getHeight();

}

示例:

原图像:

0 1 2 1

2 1 3 2

1 1 4 1

0 1 1 2

执行fillWithColor(2, 2, 5),进行颜色填充后:

0 5 2 1

2 5 3 2

5 5 4 1

0 5 5 2


思路:递归,类似迷宫寻路问题和扫雷中的无雷区域问题。

代码:

<span style="font-size:18px;">void fillWithColor(int x, int y, Color c)
{
	Color old_c = getPixel(x, y);
	if(old_c == c) return;
	setPixel(x, y, c);
	if(x > 0 && getPixel() == old_c) fillWithColor(x-1, y, c);
	if(x < getHeight && getPixel() == old_c) fillWithColor(x+1, y, c);
	if(y > 0 && getPixel() == old_c) fillWithColor(x, y-1, c);
	if(y < getWidth() && getPixel() == old_c) fillWithColor(x, y+1, c);
	return;
}</span>


3. 求最小反回文串。

对于字符串s,若任意下标i的字符都与n-1-i下标的字符不一样,则成为反回文串。

输入一个字符串,求其字典顺序的最小反回文串。

思路:

1)先将字符串按字典序升序重排,得到最小字符串;

2)若重排后为反回文串,即为所求,否则回文现象必定出现在字符串的中心位置两侧;

3)设中心位置的字符为k,且对称轴左边有m个k,右边有n个k,则将其右边的n个k右移m个单位,所得字符串即为所求(注意:并非所有字符串都能求出反回文串,其充要条件是字符串中任意字符的数量都不超过字符串长度的一半)。


代码:

package xiaomiTest3;

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static String rearrange(String s){
		char [] arr = s.toCharArray();
		Arrays.sort(arr);
		int length = arr.length;
		char mid = arr[length / 2];	//中间轴位置(长为奇数),或中间轴右侧第一位(长为偶数)
		int l = 1, r = 1, start = 0;
		if(length % 2 == 0){
			if(arr[length / 2 - 1] != mid) return new String(arr);
			start = length / 2;
			for(int i = length / 2 - 2; i >= 0 && arr[i] == mid; i--) l++;
			for(int i = length / 2 + 1; i < length && arr[i] == mid; i++) r++;
			if(l + r > length / 2) return null;
		}
			
		if(length % 2 == 1){
			if(arr[length / 2 - 1] != arr[length / 2 + 1]) return new String(arr);
			start = length / 2 + 1;
			for(int i = length / 2 - 2; i >= 0 && arr[i] == mid; i--) l++;
			for(int i = length / 2 + 2; i < length && arr[i] == mid; i++) r++;
			if(l + r > length / 2) return null;
		}
		String s1 = new String(arr);
		//System.out.println(s1 + " " + start + " " + l + " " + r);
		return s1.substring(0, start) + s1.substring(start + r, start + r + l)
			+ s1.substring(start, start + r) + s1.substring(start + r + l);
	}
	
	public static void main(String [] args){
		Scanner sca = new Scanner(System.in);
		while(sca.hasNextLine()){
			System.out.println(rearrange(sca.nextLine()));
		}
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值