java李大伯换零钱
时间: 2023-11-18 22:55:23 浏览: 218
Java李大伯换零钱是一个关于硬币找零问题的算法。给定不同面额的硬币和一个总金额,算法的目标是计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。这个算法使用了深度优先搜索(DFS)的思想,通过不断地减少总金额,直到减少到0或者小于0,然后回溯到上一个状态,继续搜索。在搜索过程中,记录当前已经使用的硬币数量,如果当前使用的硬币数量比之前记录的最小值还要小,就更新最小值。这个算法的时间复杂度为O(S^n),其中S是总金额,n是硬币的种类数。
相关问题
蒜头君是一个粗心的娃娃。今天在食堂打翻了洗碗大伯的篮子,筷子落了一地。 结果大伯怒了,硬是要蒜头君把筷子一对一对配回去。 每只筷子都是有长度的,长度一样的筷子才算是一对。不过洗碗大伯跟蒜头君说其中有一只筷子是落单的。如何用c++位运算帮蒜头君找出落单的筷子的长度吗?
要用C++位运算帮蒜头君找出落单的筷子的长度,可以使用异或(XOR)运算。
首先,将所有的筷子长度进行异或运算。异或运算的特性是,相同的两个数异或的结果为0,不同的两个数异或的结果为1。对于筷子长度来说,相同的长度进行异或运算后结果为0。
然后,将所有筷子长度的异或结果与0进行异或运算。由于0与任何数异或的结果都是这个数本身,所以最后的结果就是落单的筷子的长度。
下面是使用C++实现的示例代码:
```cpp
#include <iostream>
using namespace std;
int findSingleChopstick(int lengths[], int size) {
int result = 0;
for (int i = 0; i < size; i++) {
result ^= lengths[i];
}
return result;
}
int main() {
int lengths[] = { 10, 5, 7, 5, 7 };
int size = sizeof(lengths) / sizeof(lengths[0]);
int singleChopstickLength = findSingleChopstick(lengths, size);
cout << "落单的筷子长度为: " << singleChopstickLength << endl;
return 0;
}
```
在这个示例中,筷子长度数组为{10, 5, 7, 5, 7},其中有一只筷子是落单的。运行代码后输出结果为落单的筷子长度为10。
使用JSON Web Token 实现登录的Java代码
使用 JSON Web Token (JWT) 实现登录的 Java 代码如下:
首先,需要引入以下依赖:
```xml
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
```
然后,可以编写一个 `JwtUtil` 类来实现 JWT 的生成和解析:
```java
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;
public class JwtUtil {
private static final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
public static String generateToken(String subject, long expirationTimeMillis) {
Date now = new Date();
Date expirationDate = new Date(now.getTime() + expirationTimeMillis);
return Jwts.builder()
.setSubject(subject)
.setIssuedAt(now)
.setExpiration(expirationDate)
.signWith(key)
.compact();
}
public static String parseToken(String token) {
Claims claims = Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(token)
.getBody();
return claims.getSubject();
}
}
```
在上面的代码中,`generateToken` 方法用于生成 JWT,接受一个 `subject` 参数表示用户 ID,和一个 `expirationTimeMillis` 参数表示过期时间(以毫秒为单位)。`parseToken` 方法用于解析 JWT,返回其中的用户 ID。
接下来,可以编写一个简单的登录接口:
```java
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LoginController {
@PostMapping("/login")
public ResponseEntity<String> login(@RequestBody User user) {
if (authenticate(user)) {
String token = JwtUtil.generateToken(user.getId(), 86400000);
return ResponseEntity.ok(token);
} else {
return ResponseEntity.badRequest().build();
}
}
private boolean authenticate(User user) {
// TODO: 实现验证逻辑
return true;
}
}
```
在上面的代码中,`User` 是一个简单的 Java 类,包含一个字符串类型的 `id` 属性。`login` 方法接受一个 `User` 对象作为参数,调用 `authenticate` 方法进行验证。如果验证通过,则使用 `JwtUtil.generateToken` 方法生成 JWT 并返回;否则返回错误响应。
最后,可以编写一个使用 JWT 进行身份验证的接口:
```java
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/user")
public ResponseEntity<String> getUser(@RequestHeader("Authorization") String authorizationHeader) {
String token = authorizationHeader.substring(7);
String userId = JwtUtil.parseToken(token);
// TODO: 根据用户 ID 查询用户信息并返回
return ResponseEntity.ok("User ID: " + userId);
}
}
```
在上面的代码中,`getUser` 方法接受一个名为 `Authorization` 的请求头,其中包含 JWT。首先从请求头中获取 JWT,并调用 `JwtUtil.parseToken` 方法解析其中的用户 ID。然后根据用户 ID 查询用户信息并返回。
注意,在实际应用中,需要对 JWT 进行安全性考虑,比如使用 HTTPS 协议传输、设置较短的过期时间、使用更复杂的密钥等。
阅读全文