android算法题
1. android 面试,算法题。
final int size = data.length;
for(int i = 0; i< size; i++){
if(data[i] == 0xffffffff)
data[i] = 0x80ffffff;
}
不知道你是不是这个意思。
2. 毕业设计选了用android做一个3d魔方的游戏,应为android以前没接触过的,要从头开始学的。这个难吗高手
只要java好就没有问题,这是3D魔方android的源码。
package com.example.android.image3D;
import android.view.SurfaceView;
import android.view.SurfaceHolder;
import android.content.Context;
import android.util.AttributeSet;
import java.util.ArrayList;
import java.util.concurrent.Semaphore;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGL11;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
import javax.microedition.khronos.opengles.GL;
import javax.microedition.khronos.opengles.GL10;
public class View3D extends SurfaceView implements SurfaceHolder.Callback {
private static final Semaphore sEglSemaphore = new Semaphore(1);
private boolean mSizeChanged = true;
private SurfaceHolder mHolder;
private GLThread mGLThread;
private GLWrapper mGLWrapper;
public View3D(Context context) {
super(context);
init();
}
public View3D(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
}
public SurfaceHolder getSurfaceHolder() {
return mHolder;
}
public void setGLWrapper(GLWrapper glWrapper) {
mGLWrapper = glWrapper;
}
public void setRenderer(Renderer renderer) {
mGLThread = new GLThread(renderer);
mGLThread.start();
}
public void surfaceCreated(SurfaceHolder holder) {
mGLThread.surfaceCreated();
}
public void surfaceDestroyed(SurfaceHolder holder) {
mGLThread.surfaceDestroyed();
}
public void surfaceChanged(SurfaceHolder holder,
int format, int w, int h) {
mGLThread.onWindowResize(w, h);
}
public void onPause() {
mGLThread.onPause();
}
public void onResume() {
mGLThread.onResume();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
mGLThread.onWindowFocusChanged(hasFocus);
}
public void queueEvent(Runnable r) {
mGLThread.queueEvent(r);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mGLThread.requestExitAndWait();
}
public interface GLWrapper {
GL wrap(GL gl);
}
public interface Renderer {
int[] getConfigSpec();
void surfaceCreated(GL10 gl);
void sizeChanged(GL10 gl, int width, int height);
void drawFrame(GL10 gl);
}
private class EglHelper {
EGL10 mEgl;
EGLDisplay mEglDisplay;
EGLSurface mEglSurface;
EGLConfig mEglConfig;
EGLContext mEglContext;
public EglHelper() {
}
public void start(int[] configSpec){
mEgl = (EGL10) EGLContext.getEGL();
mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
int[] version = new int[2];
mEgl.eglInitialize(mEglDisplay, version);
EGLConfig[] configs = new EGLConfig[1];
int[] num_config = new int[1];
mEgl.eglChooseConfig(mEglDisplay, configSpec, configs, 1,
num_config);
mEglConfig = configs[0];
mEglContext = mEgl.eglCreateContext(mEglDisplay, mEglConfig,
EGL10.EGL_NO_CONTEXT, null);
mEglSurface = null;
}
public GL createSurface(SurfaceHolder holder) {
if (mEglSurface != null) {
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);
mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
}
mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay,
mEglConfig, holder, null);
mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
mEglContext);
GL gl = mEglContext.getGL();
if (mGLWrapper != null) {
gl = mGLWrapper.wrap(gl);
}
return gl;
}
public boolean swap() {
mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);
return mEgl.eglGetError() != EGL11.EGL_CONTEXT_LOST;
}
public void finish() {
if (mEglSurface != null) {
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_CONTEXT);
mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
mEglSurface = null;
}
if (mEglContext != null) {
mEgl.eglDestroyContext(mEglDisplay, mEglContext);
mEglContext = null;
}
if (mEglDisplay != null) {
mEgl.eglTerminate(mEglDisplay);
mEglDisplay = null;
}
}
}
class GLThread extends Thread {
private boolean mDone;
private boolean mPaused;
private boolean mHasFocus;
private boolean mHasSurface;
private boolean mContextLost;
private int mWidth;
private int mHeight;
private Renderer mRenderer;
private ArrayList<Runnable>
mEventQueue = new ArrayList<Runnable>();
private EglHelper mEglHelper;
GLThread(Renderer renderer) {
super();
mDone = false;
mWidth = 0;
mHeight = 0;
mRenderer = renderer;
setName("GLThread");
}
@Override
public void run() {
try {
try {
sEglSemaphore.acquire();
} catch (InterruptedException e) {
return;
}
guardedRun();
} catch (InterruptedException e) {
} finally {
sEglSemaphore.release();
}
}
private void guardedRun() throws InterruptedException {
mEglHelper = new EglHelper();
int[] configSpec = mRenderer.getConfigSpec();
mEglHelper.start(configSpec);
GL10 gl = null;
boolean tellRendererSurfaceCreated = true;
boolean tellRendererSurfaceChanged = true;
while (!mDone) {
int w, h;
boolean changed;
boolean needStart = false;
synchronized (this) {
Runnable r;
while ((r = getEvent()) != null) {
r.run();
}
if (mPaused) {
mEglHelper.finish();
needStart = true;
}
if(needToWait()) {
while (needToWait()) {
wait();
}
}
if (mDone) {
break;
}
changed = mSizeChanged;
w = mWidth;
h = mHeight;
mSizeChanged = false;
}
if (needStart) {
mEglHelper.start(configSpec);
tellRendererSurfaceCreated = true;
changed = true;
}
if (changed) {
gl = (GL10) mEglHelper.createSurface(mHolder);
tellRendererSurfaceChanged = true;
}
if (tellRendererSurfaceCreated) {
mRenderer.surfaceCreated(gl);
tellRendererSurfaceCreated = false;
}
if (tellRendererSurfaceChanged) {
mRenderer.sizeChanged(gl, w, h);
tellRendererSurfaceChanged = false;
}
if ((w > 0) && (h > 0)) {
mRenderer.drawFrame(gl);
mEglHelper.swap();
}
}
mEglHelper.finish();
}
private boolean needToWait() {
return (mPaused || (! mHasFocus) || (! mHasSurface) || mContextLost)
&& (! mDone);
}
public void surfaceCreated() {
synchronized(this) {
mHasSurface = true;
mContextLost = false;
notify();
}
}
public void surfaceDestroyed() {
synchronized(this) {
mHasSurface = false;
notify();
}
}
public void onPause() {
synchronized (this) {
mPaused = true;
}
}
public void onResume() {
synchronized (this) {
mPaused = false;
notify();
}
}
public void onWindowFocusChanged(boolean hasFocus) {
synchronized (this) {
mHasFocus = hasFocus;
if (mHasFocus == true) {
notify();
}
}
}
public void onWindowResize(int w, int h) {
synchronized (this) {
mWidth = w;
mHeight = h;
mSizeChanged = true;
}
}
public void requestExitAndWait() {
synchronized(this) {
mDone = true;
notify();
}
try {
join();
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
public void queueEvent(Runnable r) {
synchronized(this) {
mEventQueue.add(r);
}
}
private Runnable getEvent() {
synchronized(this) {
if (mEventQueue.size() > 0) {
return mEventQueue.remove(0);
}
}
return null;
}
}
}
3. 五子棋人机简单算法,根据下面算法描述写代码,代码附解释(android)
这是问题?还是论文?
是否考虑一下棋谱匹配算法?
4. Android中%和&&是什么算法
%是取余数 5%2 =1
/是取整数 5/2 =2
&&是“并且”的意思
5. Android开发计步器,求解释代码、、、求大神!
着急的计算,是走动时手机的颤动,这是根据重力感应计算
6. android md5 算法那么多哪个是对的
在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数。然后将此 128 位计 16 个字节转换成 16 进制表示即可。
下面是一个可生成字符串或文件MD5校验码的例子,测试过,可当做工具类直接使用,其中最主要的是getMD5String(String s)和getFileMD5String(File file)两个方法,分别用于生成字符串的md5校验值和生成文件的md5校验值,getFileMD5String_old(File file)方法可删除,不建议使用:
Java代码
package com.why.md5;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
/**
* 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合
*/
protected static char hexDigits[] = { '0' , '1' , '2' , '3' , '4' , '5' , '6' ,
'7' , '8' , '9' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' };
protected static MessageDigest messagedigest = null ;
static {
try {
messagedigest = MessageDigest.getInstance("MD5" );
} catch (NoSuchAlgorithmException nsaex) {
System.err.println(MD5Util.class .getName()
+ "初始化失败,MessageDigest不支持MD5Util。" );
nsaex.printStackTrace();
}
}
/**
* 生成字符串的md5校验值
*
* @param s
* @return
*/
public static String getMD5String(String s) {
return getMD5String(s.getBytes());
}
/**
* 判断字符串的md5校验码是否与一个已知的md5码相匹配
*
* @param password 要校验的字符串
* @param md5PwdStr 已知的md5校验码
* @return
*/
public static boolean checkPassword(String password, String md5PwdStr) {
String s = getMD5String(password);
return s.equals(md5PwdStr);
}
/**
* 生成文件的md5校验值
*
* @param file
* @return
* @throws IOException
*/
public static String getFileMD5String(File file) throws IOException {
InputStream fis;
fis = new FileInputStream(file);
byte [] buffer = new byte [ 1024 ];
int numRead = 0 ;
while ((numRead = fis.read(buffer)) > 0 ) {
messagedigest.update(buffer, 0 , numRead);
}
fis.close();
return bufferToHex(messagedigest.digest());
}
/**
* JDK1.4中不支持以MappedByteBuffer类型为参数update方法,并且网上有讨论要慎用MappedByteBuffer,
* 原因是当使用 FileChannel.map 方法时,MappedByteBuffer 已经在系统内占用了一个句柄,
* 而使用 FileChannel.close 方法是无法释放这个句柄的,且FileChannel有没有提供类似 unmap 的方法,
* 因此会出现无法删除文件的情况。
*
* 不推荐使用
7. android加密算法有哪些
android中用的到加密:
Https编程 :应该是使用带安全的网络协议处理。除非你本地需要加密
2.数据签名:混淆代码和防二次打包的APK加密技术
3.对称加密:可以先将数据通过某种加密方式加密发送到服务器端,然后服务器端再解密 ,项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密
4.非对称加密====支付宝
数字摘要是指通过算法将长数据变为短数据,通常用来标识数据的唯一性,是否被修改,常用的加密算法有md5和sha1两种,如Android的App签名也是用的这两种算法。
由于以上两种生成数字摘要的算法都是不可逆的,对于可逆的加密算法中,按照密钥的数量和加密规则一半分为对称加密和非对称加密两类:
对称加密:
密钥可以自己指定,只有一把密钥,如果密钥泄漏数据就会暴漏;
常用的对称加密算法有DES和AES两种;
特点是加密速度快,但是缺点是安全性低,因为只要密钥暴漏,数据就可以被解密。
非对称加密的特点:
常见的非对称加密算法是RSA;
他有两把密钥,且是由程序生成的,不能自己指定;
特点是加密速度比较慢,但是安全性比较高;
加密和解密的规则是:公钥加密只能私钥解密,私钥加密只能公钥解密;
8. android写一个算法求12和8的最大公约数
classex1
{
intgys1(intm,intn)//循环实现
{
intk,y;
if(m<n)
{
k=m;
m=n;
n=k;
}
while(m%n!=0)
{
y=m%n;
m=n;
n=y;
}
returnn;
}
intgys2(intm,intn)//递归实现
{
intk,y;
if(m<n)
{
k=m;
m=n;
n=k;
}
y=m%n;
if(y==0)
{
returnn;
}
else
{
m=n;
n=y;
returngys2(m,n);
}
}
publicstaticvoidmain(String[]args)
{
ex1e1=newex1();
System.out.println(e1.gys1(12,8));
ex1e2=newex1();
System.out.println(e1.gys2(12,8));
}
}
9. android 面试题
1、前言
6 月 26 日, Google Android 发布了 NDK ,引起了很多发人员的兴趣。 NDK 全
称: Native Development Kit 。下载地址为:
http://developer.android.com/sdk/ndk/1.5_r1/index.html 。
2、误解
新出生的事物,除了惊喜外,也会给我们带来一定的迷惑、误解。
2.1、误解一: NDK 发布之前, Android 不支持进行 C 开发
在 Google 中搜索 “NDK” ,很多 “Android 终于可以使用 C++ 开发 ” 之类
的标题,这是一种对 Android 平台编程方式的误解。其实, Android 平台从诞生起,就已
经支持 C 、 C++ 开发。众所周知, Android 的 SDK 基于 Java 实现, 这意味着基于 Android
SDK 进行开发的第三方应用都必须使用 Java 语言。但这并不等同于 “ 第三方应用只能使
用 Java” 。在 Android SDK 首次发布时, Google 就宣称其虚拟机 Dalvik 支持 JNI 编程
方式,也就是第三方应用完全可以通过 JNI 调用自己的 C 动态库,即在 Android 平台上,
“Java+C” 的编程方式是一直都可以实现的。
当然这种误解的产生是有根源的:在 Android SDK 文档里,找不到任何 JNI 方面的
帮助。即使第三方应用开发者使用 JNI 完成了自己的 C 动态链接库( so )开发,但是 so
如何和应用程序一起打包成 apk 并发布?这里面也存在技术障碍。我曾经花了不少时间,
安装交叉编译器创建 so ,并通过 asset (资源)方式,实现捆绑 so 发布。但这种方式只
能属于取巧的方式,并非官方支持。所以,在 NDK 出来之前,我们将 “Java+C” 的开发
模式称之为灰色模式,即官方既不声明 “ 支持这种方式 ” ,也不声明 “ 不支持这种方
式 ” 。
2.2、误解二:有了 NDK ,我们可以使用纯 C 开发 Android 应用
Android SDK 采用 Java 语言发布,把众多的 C 开发人员排除在第三方应用开发外
( 注意:我们所有讨论都是基于“ 第三方应用开发 ” , Android 系统基于 Linux ,系
统级别的开发肯定是支持 C 语言的。 )。 NDK 的发布,许多人会误以为,类似于 Symbian 、
WM ,在 Android 平台上终于可以使用纯 C 、 C++ 开发第三方应用了!其实不然, NDK
文档明确说明: it is not a good way 。因为 NDK 并没有提供各种系统事件处理支持,也没
有提供应用程序生命周期维护。此外,在本次发布的 NDK 中,应用程序 UI 方面的 API 也
没有提供。至少目前来说,使用纯 C 、 C++ 开发一个完整应用的条件还不完备。
3、NDK 是什么
对 NDK 进行了粗略的研究后,我对 “NDK 是什么 ” 的理解如下:
1、NDK 是一系列工具的集合。
NDK 提供了一系列的工具,帮助开发者快速开发 C (或 C++ )的动态库,并能自动
将 so 和 java 应用一起打包成 apk 。这些工具对开发者的帮助是巨大的。
NDK 集成了交叉编译器,并提供了相应的 mk 文件隔离 CPU 、平台、 ABI 等差异,
开发人员只需要简单修改 mk 文件(指出 “ 哪些文件需要编译 ” 、 “ 编译特性要求 ”
等),就可以创建出 so 。
NDK 可以自动地将 so 和 Java 应用一起打包,极大地减轻了开发人员的打包工作。
2、NDK 提供了一份稳定、功能有限的 API 头文件声明。
oogle 明确声明该 API 是稳定的,在后续所有版本中都稳定支持当前发布的 API 。
从该版本的 NDK 中看出,这些 API 支持的功能非常有限,包含有: C 标准库( libc )、
标准数学库( libm )、压缩库( libz )、 Log 库( liblog )。
G
4、NDK 带来什么
1、NDK 的发布,使 “Java+C” 的开发方式终于转正,成为官方支持的开发方式。
使用 NDK ,我们可以将要求高性能的应用逻辑使用 C 开发,从而提高应用程序的执
行效率。
使用 NDK ,我们可以将需要保密的应用逻辑使用 C 开发。毕竟, Java 包都是可以反
编译的。
NDK 促使专业 so 组件商的出现。(乐观猜想,要视乎 Android 用户的数量)
2、NDK 将是 Android 平台支持 C 开发的开端。
NDK 提供了的开发工具集合,使开发人员可以便捷地开发、发布 C 组件。同时,
Google 承诺在 NDK 后续版本中提高 “ 可调式 ” 能力,即提供远程的 gdb 工具,使我
们可以便捷地调试 C 源码。在支持 Android 平台 C 开发,我们能感觉到 Google 花费了
很大精力,我们有理由憧憬 “C 组件支持 ” 只是 Google Android 平台上 C 开发的开端。
毕竟, C 程序员仍然是码农阵营中的绝对主力,将这部分人排除在 Android 应用开发之外,
显然是不利于 Android 平台繁荣昌盛的。
10. android消灭星星寻找相同星星算法(不用任何游戏引擎:如Cocos2dx...)
如果要代码的话,我也没有,不过网上应该能搜到吧。要思路的话,可以一起讨论讨论